1. 程式人生 > >使用Requests庫和BeautifulSoup庫來爬取網頁上需要的文字與圖片

使用Requests庫和BeautifulSoup庫來爬取網頁上需要的文字與圖片

Pythone現在已經成為全球最火爆的語言了,它的強大之處想必不需要我多說吧。接下來我就Python網路爬蟲來談一談本渣渣的見解。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(以上都是廢話,下面開始進入正題)

以下內容基於Python3

網路爬蟲根據爬取的工作量可以分成頁面級的網路爬蟲與網站級的網路爬蟲,兩種差別解決的方法也不相同,下面是爬蟲的基本思路:

一.頁面級的網路爬蟲

    1.requests 庫獲得一個請求迴應
    2.BeautifulSoup 庫解析html檔案
    3.對解析的soup進行查詢:
      (1)RE正則表示式
      (2)find_all(“xx”)定位標籤內容
    4.對爬取的內容進行操作(字串的加減)
二.網站級的頁面爬蟲

    scrapy框架

(一)首先安裝Python3,具體流程xx

(二)在CMD介面下 使用pip 命令下載Requests庫與BeautifulSoup庫

pip install requests


pip install beautifulsoup4


完成後Requests庫與BeautifulSoup庫就下載完成啦!!

下面來兩個小例項:

一.標籤查詢類爬蟲(簡單例項) (eg:http://news.sina.com.cn/photo/rel/csjsy07/399/)

爬取淮安日報圖片精選的圖片 


用瀏覽器開啟該網頁,右擊檢視該網頁的原始碼;

 形如如下圖的html程式碼形式:會發現圖片的源地址在<img>標籤內,於是我們只要定位到這個標籤取出地址就可以了。


思路如下:
首先匯入requests庫向網頁傳送請求接收請求迴應。
然後丟擲異常,判斷網頁是否成功接收到請求
其次判斷編碼型別,修改編碼
再次生成一個Soup,將html檔案進行解釋
最後查詢標籤,獲取內容並且對內容進行一系列操作

程式碼如下:
import requests
from bs4 import BeautifulSoup
import urllib
r=requests.get("http://news.sina.com.cn/photo/rel/csjsy07/399/")
r.encoding=r.apparent_encoding
text=r.text                                                                                     
soup=BeautifulSoup(text,"html.parser")
a=soup.find_all('img',{'class':'b1'})
for i in a:
print(i['src'])
執行結果如圖:

沒錯就是這麼簡單。

二.正則表示式類爬蟲(簡單例項) (eg:https://s.taobao.com/search?q=iphone)

目標:爬取淘寶搜尋iPhone的標題與價格    

   


形如如下圖的html程式碼形式,內容是以鍵值對的方式進行存放的(raw_title:xxxxxxx)不像上面的標籤內取值,於是我們就用到了正則表示式。


思路如下:
首先匯入requests庫向網頁傳送請求接收請求迴應。
然後匯入RE庫
其次丟擲異常,判斷網頁是否成功接收到請求
再次判斷編碼型別,修改編碼
最後用正則表示式獲取內容並且對內容進行一系列操作

程式碼如下:

import requests
import re
from bs4 import BeautifulSoup
r=requests.get("https://s.taobao.com/search?q=iphone")                          
html=r.text
j=1
title =re.findall(r'\"raw_title\"\:\".*?\"', html)
price= re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
for i in range(len(price)):
print("標題為:{:50};價格為:{}".format(eval(title[i].split(':')[1]),eval(price[i].split(':')[1])))

執行結果如圖:到最後其實就是簡單的字串加減等運算


拓展延伸:

實現多頁面的爬蟲只需要改變url的地址就好了,比如頁面 往往都是在url中含有page=x的欄位,運用字串的加法能夠很容易的實現多頁面的爬取。
查詢比較複雜的內容時,可以結合正則表示式和find_all函式來進行深層次篩選。
對於一些網站防止爬蟲,只需要在獲得的request的頭新增上想偽裝的瀏覽器的核心,如有時間限制,也可以模擬出時間,道高一尺魔高一丈。

關於Scrapy的內容,日後我會補上,上面如有什麼問題,或者大家有什麼建議,歡迎留言!!