日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

网站爬虫Python

發布時間:2023/12/10 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网站爬虫Python 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近學完Python,寫了幾個爬蟲練練手,網上的教程有很多,但是有的已經不能爬了,主要是網站經常改,可是爬蟲還是有通用的思路的,即下載數據、解析數據、保存數據。下面一一來講。

1.下載數據

首先打開要爬的網站,分析URL,每打開一個網頁看URL有什么變化,有可能帶上上個網頁的某個數據,例如xxID之類,那么我們就需要在上一個頁面分析HTML,找到對應的數據。如果網頁源碼找不到,可能是ajax異步加載,去xhr里去找。

?

有的網站做了反爬的處理,可以添加User-Agent :判斷瀏覽器

1

2

3

self.user_agent =?'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

# 初始化 headers

self.headers = {'User-Agent': self.user_agent}

如果不行,在Chrome上按F12分析請求頭、請求體,看需不需要添加別的信息,例如有的網址添加了referer:記住當前網頁的來源,那么我們在請求的時候就可以帶上。按Ctrl + Shift + C,可以定位元素在HTML上的位置

動態網頁

有一些網頁是動態網頁,我們得到網頁的時候,數據還沒請求到呢,當然什么都提取不出來,用Python 解決這個問題只有兩種途徑:直接從JavaScript 代碼里采集內容,或者用Python 的第三方庫運行JavaScript,直接采集你在瀏覽器里看到的頁面。

1.找請求,看返回的內容,網頁的內容可能就在這里。然后可以復制請求,復雜的網址中,有些亂七八糟的可以刪除,有意義的部分保留。切記刪除一小部分后先嘗試能不能打開網頁,如果成功再刪減,直到不能刪減。

2.Selenium:是一個強大的網絡數據采集工具(但是速度慢),其最初是為網站自動化測試而開發的。近幾年,它還被廣泛用于獲取精確的網站快照,因為它們可以直接運行在瀏覽器上。Selenium 庫是一個在WebDriver 上調用的API。WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像BeautifulSoup對象一樣用來查找頁面元素,與頁面上的元素進行交互(發送文本、點擊等),以及執行其他動作來運行網絡爬蟲。

PhantomJS:是一個“無頭”(headless)瀏覽器。它會把網站加載到內存并執行頁面上的JavaScript,但是它不會向用戶展示網頁的圖形界面。把Selenium和PhantomJS 結合在一起,就可以運行一個非常強大的網絡爬蟲了,可以處理cookie、JavaScript、header,以及任何你需要做的事情。

下載數據的模塊有urllib、urllib2及Requests

Requests相比其他倆個的話,支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自 動確定響應內容的編碼,支持國際化的 URL 和 POST 數據自動編碼,而且api相對來說也簡單,但是requests直接使用不能異步調用,速度慢。

1

html = requests.get(url, headers=headers)?? #沒錯,就是這么簡單

  

urllib2以我爬取淘寶的妹子例子來說明:??

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

user_agent =?'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

headers = {'User-Agent': user_agent}

# 注意:form data請求參數

params?=?'q&viewFlag=A&sortType=default&searchStyle=&searchRegion=city%3A&searchFansNum=&currentPage=1&pageSize=100'

def getHome():

????url =?'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'

????req = urllib2.Request(url, headers=headers)

????# decode(’utf - 8’)解碼?? 把其他編碼轉換成unicode編碼

????# encode(’gbk’) 編碼? 把unicode編碼轉換成其他編碼

????# ”gbk”.decode(’gbk’).encode(’utf - 8')

????# unicode = 中文

????# gbk = 英文

????# utf - 8 = 日文

????# 英文一 > 中文一 > 日文,unicode相當于轉化器

????html = urllib2.urlopen(req, data=params).read().decode('gbk').encode('utf-8')

????# json轉對象

????peoples = json.loads(html)

????for?i?in?peoples['data']['searchDOList']:

????????#去下一個頁面獲取數據

????????getUseInfo(i['userId'], i['realName'])

  

2.解析數據

解析數據也有很多方式,我只看了beautifulsoup和正則,這個例子是用正則來解析的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def getUseInfo(userId, realName):

????url =?'https://mm.taobao.com/self/aiShow.htm?userId='?+ str(userId)

????req = urllib2.Request(url)

????html = urllib2.urlopen(req).read().decode('gbk').encode('utf-8')

????pattern = re.compile('<img.*?src=(.*?)/>', re.S)

????items = re.findall(pattern, html)

????x = 0

????for?item?in?items:

????????if?re.match(r'.*(.jpg")$', item.strip()):

????????????tt =?'http:'?+ re.split('"', item.strip())[1]

????????????down_image(tt, x, realName)

????????????x = x + 1

????print('下載完畢')

  

正則表達式說明

match:匹配string 開頭,成功返回Match object, 失敗返回None,只匹配一個。
search:在string中進行搜索,成功返回Match object, 失敗返回None, 只匹配一個。
findall:在string中查找所有 匹配成功的組, 即用括號括起來的部分。返回list對象,每個list item是由每個匹配的所有組組成的list。

1).*? 是一個固定的搭配,.和*代表可以匹配任意無限多個字符,加上?表示使用非貪婪模式進行匹配,也就是我們會盡可能短地做匹配

2)(.*?)代表一個分組,如果有5個(.*?)就說明匹配了五個分組

3)?正則表達式中,“.”的作用是匹配除“\n”以外的任何字符,也就是說,它是在一行中進行匹配。這里的“行”是以“\n”進行區分的。HTML標簽每行的末尾有一個“\n”,不過它不可見。?如果不使用re.S參數,則只在每一行內進行匹配,如果一行沒有,就換下一行重新開始,不會跨行。而使用re.S參數以后,正則表達式會將這個字符串作為一個整體,將“\n”當做一個普通的字符加入到這個字符串中,在整體中進行匹配。

3.保存數據

數據解析后可以保存到文件或數據庫中,這個例子是保存到了文件中,很簡單,就不做說明了,在下篇講如何將數據保存到數據庫

Python用Django寫restful api接口 - 夢和遠方 - 博客園

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def down_image(url, filename, realName):

????req = urllib2.Request(url=url)

????folder =?'e:\\images\\%s'?% realName

????if?os.path.isdir(folder):

????????pass

????else:

????????os.makedirs(folder)

????f = folder +?'\\%s.jpg'?% filename

????if?not os.path.isfile(f):

????????print f

????????binary_data = urllib2.urlopen(req).read()

????????with open(f,?'wb')?as?temp_file:

????????????temp_file.write(binary_data)

  

GitHub地址,還有其他網站爬蟲,歡迎star:GitHub - peiniwan/Spider2: Python爬蟲和練習

總結

以上是生活随笔為你收集整理的网站爬虫Python的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。