《用python寫網路爬蟲》第一章

2021-07-30 06:07:30 字數 3663 閱讀 8402

在python3 的基礎上實現的,但是相對於作者的**少了支援**部分和避免爬蟲陷阱部分,**寫入了自己寫的注釋,暫時的理解就是這樣了,希望有看到的朋友可以指正一下,小白成長中。。。

import urllib.request

import urllib.error

import re

import urllib.parse

from urllib.parse import urljoin

import urllib.robotparser

import time

from datetime import datetime

def download(url,user_agent='wswp',proxy=none,num_retries=2):

print('downloading:', url)

headers=

request = urllib.request.request(url,headers=headers)

opener = urllib.request.build_opener()

# urlopen()函式不支援驗證、cookie或者其它http高階功能。要支援這些功能,必須使用build_opener()函式建立自定義opener物件

# #用正規表示式提取sitemap鏈結

# links=re.findall('(.*?)',sitemap)

# for link in links:

# html=download(link)

def link_crawler(seed_url,link_regex,user_agent='wswp',delay=5):

crawl_queue=[seed_url]

rp=get_robots(seed_url)

seen=set(crawl_queue)

while crawl_queue:

url=crawl_queue.pop()

#從列表中取出url,此時列表為空

if rp.can_fetch(user_agent,url):

#確定指定的使用者**是否允許訪問網頁

html=download(url)

#呼叫download函式開啟並解析**

for link in get_links(html):

#遞迴迴圈get_links函式中得到的每一條鏈結

if re.match(link_regex,link):

#如果有與正規表示式相匹配的鏈結就取出來

link =urllib.parse.urljoin(seed_url,link)

#用urlparse將相對鏈結轉化為絕對鏈結

if link not in seen:

#檢驗集合中是否已經有了這個鏈結

seen.add(link)

#當集合中沒有這個鏈結時新增到集合中

# print(crawl_queue)

else:

print('block by robots.txt:',url)

def get_robots(url):

rp=urllib.robotparser.robotfileparser()

rp.set_url(urllib.parse.urljoin(url,'/robots.txt'))

rp.read()

return rp

#獲取網頁中所有鏈結

def get_links(html):

#正規表示式四去匹配網頁中所有的鏈結

webpage_regex = re.compile(']+href=["\'](.*?)["\']', re.ignorecase)

return webpage_regex.findall(html)

class throttle:

def __init__(self,delay):

self.delay=delay

#上次訪問域時的時間戳

self.domains={}

def wait(self,url):

domain=urllib.parse.urlparse(url).netloc

#解析url格式取出netloc即『example.webscraping.com』

last_accessed=self.domains.get(domain)

if self.delay>0 and last_accessed is not none:

sleep_secs=self.delay-(datetime.now()-last_accessed).seconds

#將指定延時與當前時間距離上次訪問時間作比較

if sleep_secs>0:

time.sleep(sleep_secs)

#如果當前時間距離上次訪問時間小於指定延時,則執行睡眠操作

self.domains[domain]=datetime.now()

#更新訪問時間為當前時間

if __name__ == '__main__':

link_crawler('', '/(index|view)',delay=0,user_agent='badcrawler')

link_crawler('', '/(index|view)',delay=0, user_agent='goodcrawler')

執行部分結果:

python網路爬蟲(第一章)

內容來自於o reilly 人民郵電出版社 的 python網路爬蟲權威指南 此部落格僅用於記錄學習,方便以後使用 目前本系列文章 python網路爬蟲筆記 更新情況 第一章 本文 第二章 python網路爬蟲 第二章 簡單例項 python網路爬蟲 簡單例項 print title 1 urlli...

爬蟲第一章

爬蟲基礎 什麼是爬蟲?爬蟲是通過程式模擬瀏覽器上網,從網上獲取資料的過程.爬蟲的分類 通用爬蟲 爬取一整個頁面的資料.聚焦爬蟲 爬取頁面中指定的區域性資料 增量式爬蟲 檢測 中資料更新的情況,爬取的是 中最新更新出來的資料.什麼是反爬機制?製作時設定的一系列阻止爬蟲程式進行的阻礙,就是反爬機制,反爬...

python爬蟲學習 第一章 爬蟲基礎

通過編寫程式,模擬瀏覽器上網,然後讓其去網際網路上抓取資料的過程。比如 電商願意被比價 或者購物資訊 爬取資訊,因為可以為他們的商品帶來更多的流量 而不願意被同行爬取 資訊,或者產品資訊 但是很多電商又會去爬取同行的商品資訊。如何解決這個矛盾?反爬機制 門戶 可以通過制定相應的策略或者技術手段,防止...