用Python開發(fā)爬蟲蠢壹,看這篇文章就夠了

現(xiàn)在Python語言大火嗓违,在網(wǎng)絡爬蟲、人工智能图贸、大數(shù)據(jù)等領域都有很好的應用蹂季。今天我向大家介紹一下Python爬蟲的一些知識和常用類庫的用法冕广,希望能對大家有所幫助。

其實爬蟲這個概念很簡單偿洁,基本可以分成以下幾個步驟:

  • 發(fā)起網(wǎng)絡請求
  • 獲取網(wǎng)頁
  • 解析網(wǎng)頁獲取數(shù)據(jù)

發(fā)起網(wǎng)絡請求這個步驟常用的類庫有標準庫urllib以及Python上常用的requests庫撒汉。解析網(wǎng)頁常用的類庫有的BeautifulSoup。另外requests的作者還開發(fā)了另一個很好用的庫requests-html涕滋,提供了發(fā)起請求和解析網(wǎng)頁的二合一功能睬辐,開發(fā)小型爬蟲非常方便。另外還有一些專業(yè)的爬蟲類庫宾肺,其中比較出名的就是scrapy溯饵。本文將會簡單介紹一下這些類庫,之后還會專門寫一篇文章介紹scrapy的用法锨用。

標準庫urllib

首先先來看標準庫urllib丰刊。標準庫的優(yōu)點是Python自帶的,不需要安裝任何第三方庫黔酥,缺點就是urllib屬于偏底層的庫藻三,使用起來比較麻煩。下面是urllib發(fā)起請求的一個簡單例子跪者,大家看看就好棵帽。可以看到為了發(fā)起一個簡單的請求渣玲,我們需要創(chuàng)建opener逗概、request、ProxyHandler等好幾個對象忘衍,比較麻煩逾苫。

import urllib.request as request
import requests

proxies = {
    'https': 'https://127.0.0.1:1080',
    'http': 'http://127.0.0.1:1080'
}

headers = {
    'user-agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
}


print('--------------使用urllib--------------')
url = 'http://www.google.com'
opener = request.build_opener(request.ProxyHandler(proxies))
request.install_opener(opener)
req = request.Request(url, headers=headers)
response = request.urlopen(req)
print(response.read().decode())

requests

requests是Kenneth Reitz大神的著名作品之一,優(yōu)點就是極度簡單和好用枚钓。首先來安裝requests铅搓。

pip install requests

下面是一個簡單的例子,和上面urllib示例代碼實現(xiàn)的功能相同搀捷,但是代碼量少多了星掰,也更易讀。

print('--------------使用requests--------------')
response = requests.get('https://www.google.com', headers=headers, proxies=proxies)
response.encoding = 'utf8'
print(response.text)

requests還可以方便的發(fā)送表單數(shù)據(jù)嫩舟,模擬用戶登錄氢烘。返回的Response對象還包含了狀態(tài)碼、header家厌、raw播玖、cookies等很多有用的信息。

data = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}
response = requests.post('http://httpbin.org/post', data=data)
pprint(response.__dict__)
print(response.text)

關于requests我就不多做介紹了饭于,因為它有中文文檔蜀踏,雖然比官方落后幾個小版本號维蒙,不過無傷大雅,大家可以放心參閱脓斩。

http://cn.python-requests.org/zh_CN/latest/

beautifulsoup

利用前面介紹的requests類庫木西,我們可以輕易地獲取HTML代碼,但是為了從HTML中找到所需的數(shù)據(jù)随静,我們還需要HTML/XML解析庫八千,BeautifulSoup就是這么一個常用的庫。首先先來安裝它:

pip install beautifulsoup4

這次就用我簡書主頁作為例子燎猛,爬取一下我簡書的文章列表恋捆。首先先用requests獲取到網(wǎng)頁內(nèi)容。

from pprint import pprint
import bs4
import requests

headers = {
    'user-agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
}

url = 'http://www.reibang.com/u/7753478e1554'
response = requests.get(url, headers=headers)

然后就是BeautifulSoup的代碼了重绷。在使用BeautifulSoup的時候首先需要創(chuàng)建一個HTML樹沸停,然后從樹中查找節(jié)點。BeautifulSoup主要有兩種查找節(jié)點的辦法昭卓,第一種是使用find和find_all方法愤钾,第二種方法是使用select方法用css選擇器。拿到節(jié)點之后候醒,用contents去獲取它的子節(jié)點能颁,如果子節(jié)點是文本,就會拿到文本值倒淫,注意這個屬性返回的是列表伙菊,所以要加[0]。

html = bs4.BeautifulSoup(response.text, features='lxml')
note_list = html.find_all('ul', class_='note-list', limit=1)[0]
for a in note_list.select('li>div.content>a.title'):
    title = a.contents[0]
    link = f'http://www.reibang.com{a["href"]}'
    print(f'《{title}》,{link}')

BeautifulSoup也有中文文檔敌土,同樣也是稍微落后兩個小版本镜硕,影響不大。

https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

requests-html

這個類庫是requests的兄弟返干,同樣也是Kenneth Reitz大神的作品兴枯。它將請求網(wǎng)頁和解析網(wǎng)頁結(jié)合到了一起。本來如果你用requests的話只能請求網(wǎng)頁矩欠,為了解析網(wǎng)頁還得使用BeautifulSoup這樣的解析庫∧罨校現(xiàn)在只需要requests-html一個庫就可以辦到。

首先先來安裝晚顷。

pip install requests-html

然后我們來看看用requests-html如何重寫上面這個例子。

from requests_html import HTMLSession
from pprint import pprint

url = 'http://www.reibang.com/u/7753478e1554'
headers = {
    'user-agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
}
session = HTMLSession()
r = session.get(url, headers=headers)
note_list = r.html.find('ul.note-list', first=True)
for a in note_list.find('li>div.content>a.title'):
    title = a.text
    link = f'http://www.reibang.com{a.attrs["href"]}'
    print(f'《{title}》,{link}')

requests-html除了可以使用css選擇器來搜索以外疗疟,還可以使用xpath來查找该默。

for a in r.html.xpath('//ul[@class="note-list"]/li/div[@class="content"]/a[@class="title"]'):
    title = a.text
    link = f'http://www.reibang.com{a.attrs["href"]}'
    print(f'《{title}》,{link}')

requests-html還有一個很有用的特性就是瀏覽器渲染。有些網(wǎng)頁是異步加載的策彤,直接用爬蟲去爬只能得到一個空頁面栓袖,因為數(shù)據(jù)是靠瀏覽器運行JS腳本異步加載的匣摘,這時候就需要瀏覽器渲染了。而瀏覽器渲染用requests-html做非常簡單裹刮,只要多調(diào)用一個render函數(shù)即可音榜。render函數(shù)有兩個參數(shù),分別指定頁面下滑次數(shù)和暫停時間捧弃。render函數(shù)第一次運行的時候赠叼,requests-html會下載一個chromium瀏覽器,然后用它渲染頁面违霞。

簡書的個人文章頁面也是一個異步加載的例子嘴办,默認只會顯示最近幾篇文章,通過瀏覽器渲染模擬頁面下滑买鸽,我們可以得到所有文章列表涧郊。

session = HTMLSession()
r = session.get(url, headers=headers)
# render函數(shù)指示requests-html用chromium瀏覽器渲染頁面
r.html.render(scrolldown=50, sleep=0.2)
for a in r.html.xpath('//ul[@class="note-list"]/li/div[@class="content"]/a[@class="title"]'):
    title = a.text
    link = f'http://www.reibang.com{a.attrs["href"]}'
    print(f'《{title}》,{link}')

類似的,今日頭條的個人頁面也是異步加載的眼五,所以也得調(diào)用render函數(shù)妆艘。

from requests_html import HTMLSession

headers = {
    'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
}
session = HTMLSession()
r = session.get('https://www.toutiao.com/c/user/6662330738/#mid=1620400303194116', headers=headers)
r.html.render()

for i in r.html.find('div.rbox-inner a'):
    title = i.text
    link = f'https://www.toutiao.com{i.attrs["href"]}'
    print(f'《{title}》 {link}')

最后是requests-html的官網(wǎng)地址以及中文文檔。

https://html.python-requests.org/
https://cncert.github.io/requests-html-doc-cn/#/?id=requests-html

scrapy

以上介紹的幾個框架都是各自有各自的作用看幼,把它們結(jié)合起來可以達到編寫爬蟲的目的批旺,但是要說專業(yè)的爬蟲框架,還是得談談scrapy桌吃。作為一個著名的爬蟲框架朱沃,scrapy將爬蟲模型框架化和模塊化,利用scrapy茅诱,我們可以迅速生成功能強大的爬蟲逗物。

不過scrapy概念眾多,要仔細說還得專門開篇文章瑟俭,這里就只簡單演示一下翎卓。首先安裝scrapy,如果是Windows系統(tǒng)摆寄,還需要安裝pypiwin32失暴。

pip install scrapy
pip install pypiwin32

然后創(chuàng)建scrapy項目并添加一個新爬蟲。

scrapy startproject myproject
cd myproject
scrapy genspider my jianshu.com

打開配置文件settings.py,設置用戶代理,否則會遇到403錯誤帅韧。

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'

然后修改一下爬蟲押袍。

# -*- coding: utf-8 -*-
import scrapy

class JianshuSpider(scrapy.Spider):
    name = 'jianshu'
    allowed_domains = ['jianshu.com']
    start_urls = ['http://www.reibang.com/u/7753478e1554']

    def parse(self, response):
        for article in response.css('div.content'):
            yield {
                'title': article.css('a.title::text').get(),
                'link': 'http://www.reibang.com' + article.xpath('a[@class="title"]/@href').get()
            }

最后運行一下爬蟲。

scrapy crawl my

以上就是這篇文章的內(nèi)容了,希望對大家有所幫助。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奢驯,一起剝皮案震驚了整個濱河市黍檩,隨后出現(xiàn)的幾起案子叉袍,更是在濱河造成了極大的恐慌,老刑警劉巖刽酱,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喳逛,死亡現(xiàn)場離奇詭異,居然都是意外死亡棵里,警方通過查閱死者的電腦和手機润文,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衍慎,“玉大人转唉,你說我怎么就攤上這事∥壤Γ” “怎么了赠法?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乔夯。 經(jīng)常有香客問我砖织,道長,這世上最難降的妖魔是什么末荐? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任侧纯,我火速辦了婚禮,結(jié)果婚禮上甲脏,老公的妹妹穿的比我還像新娘眶熬。我一直安慰自己,他們只是感情好块请,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布娜氏。 她就那樣靜靜地躺著,像睡著了一般墩新。 火紅的嫁衣襯著肌膚如雪贸弥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天海渊,我揣著相機與錄音绵疲,去河邊找鬼。 笑死臣疑,一個胖子當著我的面吹牛盔憨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讯沈,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼郁岩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驯用,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儒老,沒想到半個月后蝴乔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡驮樊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年薇正,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚衔。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挖腰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出练湿,到底是詐尸還是另有隱情猴仑,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布肥哎,位于F島的核電站辽俗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏篡诽。R本人自食惡果不足惜崖飘,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杈女。 院中可真熱鬧朱浴,春花似錦、人聲如沸达椰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砰碴。三九已至躏筏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呈枉,已是汗流浹背趁尼。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猖辫,地道東北人酥泞。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像啃憎,于是被迫代替她去往敵國和親芝囤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 學習爬蟲有一段時間了,期間接觸了很多相關的庫悯姊,不禁感慨Python就是強大羡藐,當你遇到任何問題的時候基本上都有前人造...
    HomerX閱讀 7,811評論 0 13
  • 聲明:本文講解的實戰(zhàn)內(nèi)容,均僅用于學習交流悯许,請勿用于任何商業(yè)用途仆嗦! 一、前言 強烈建議:請在電腦的陪同下先壕,閱讀本文...
    Bruce_Szh閱讀 12,707評論 6 28
  • 1, 你用過的爬蟲框架或者模塊有哪些瘩扼?談談他們的區(qū)別或者優(yōu)缺點? Python自帶:urllib垃僚,urllib2 ...
    城北有夢閱讀 6,013評論 0 11
  • 龍川江岸芳草凄集绰,蓑衣斗笠釣楛枝。白彝回漢施農(nóng)藥谆棺,水族龍宮無華佗栽燕。
    沈應齊閱讀 132評論 0 0
  • 文 |桂川且留下 憂郁的莫斯科 陽光,不愿穿透云層 生怕刺痛包券,她嬌嫩的肌膚 五彩的高墻纫谅,金色的穹頂 童話般夢幻迷人...
    川上六公子閱讀 66評論 0 0