Python爬蟲小記
實習兩個月,小記下自己目前的爬蟲技巧
一、爬蟲實際上是模仿我們平時登錄網站的過程,通俗來講就是給服務器發送請求,服務器接受請求並進行解析,並給出回應,在頁面上就得到你想要的界面了。
二、用到的工具是python2.7以及谷歌瀏覽器。右鍵點擊“檢查”選項,Elements是頁面內容,Network是請求內容
三、用到的是requests這個庫,一般用到的是get和post方法,根據網站訪問需求而定。傳入的參數有url,headers,params,data。其中params和data都是傳入的是字典形式的參數,其中params是get方法時,傳參到url中用的,data是post方法傳參所用的。
headers是請求頭部,一般網站訪問可能要帶cookie,而這就在headers中。這些參數在程序中編寫加測試看的有點煩躁,不夠直觀。在這裏介紹下postman這個軟件,非常好用。可以粘貼復制參數,進行挑選,能提高效率。
四、接下來是解析得到的頁面,有可能一開始出現亂碼問題,可以看Element中的head中的“charset”編碼方式是什麽,得到頁面內容後就直接decode("該方式")。解析的工具包有BeautifulSoup和Xpath,BeautifulSoup需要找到class類型以及下面的屬性,Google的selector
可能在程序中得不出你想要的東西,需要自己手動去找關系,不過也比較簡單。Xpath的話,調用代碼是
from lxml impot etree
tree = etree.HTML(text)
#text為網頁內容
k = tree.xpath("路徑")
推薦google的xpath-helper插件。直接copy xpath內容,得到屬性內容,在該語句後面添加/@該屬性
五、舉個解析的小例子,爬下b站的視頻鏈接。
可以發現Reponse中並沒有網站信息,網頁源碼中也沒有網站信息。 我們點開帶有頁面信息的json鏈接,https://space.bilibili.com/ajax/member/getSubmitVideos?mid=8820267&pagesize=30&tid=0&page=2&keyword=&order=pubdate
此時打開www.json.cn網站在線解析,可以看出字典中的aid跟平時我們看到的視頻id很相似, 驗證後確實如此,後續只需要循環得到aid,‘https://www.bilibili.com/video/av{0}/‘.format(aid) 就是視頻網址了。附上幾行小代碼
#encoding:utf-8
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
import json
from http_requests import Response
url_1 = "https://www.bilibili.com/video/av{0}/"
class gethref():
def __init__(self):
self.sess = Response()
def run(self,url):
#url = "https://space.bilibili.com/ajax/member/getSubmitVideos?mid=8820267&pagesize=30&tid=0&page=2&keyword=&order=pubdate"
html = self.sess.get_response(method="get",url = url)
if not html:
html = self.sess.get_response(method="get", url=url)
text = html.content.decode(‘utf-8‘)
text = json.loads(text)
print text
k = text["data"]["vlist"]
for i in k:
id = i["aid"]
with open("bzhan_href.txt","a") as f:
f.writelines(url_1.format(id)+"\n")
app = gethref()
for i in range(1, 13):
url = "https://space.bilibili.com/ajax/member/getSubmitVideos?mid=8820267&pagesize=30&tid=0&page={0}&keyword=&order=pubdate".format(str(i))
app.run(url)
http_requests是用的代理程序,用request也是一樣可以的。
Python爬蟲小記