爬取網站前2_支援代理
有時我們需要使用代理訪問某個網站。比如,Netflix 遮蔽了美國以外的大多數國家。使用urllib.request支援代理並沒有想象中那麼容易(可以嘗試使用更友好的Python HTTP模組requests來實現該功能, 其文件地址為http : //docs.python-requests.org/)。下面是使用urllib.request支援代理的程式碼:
#支援代理
import urllib.request
import urllib.parse
proxy = "Brain" #你所設定的代理名
opener = urllib.request.build_opener()
proxy_params = { urllib.parse.urlparse(url).scheme: proxy }
opener.add_handler(urllib.request.ProxyHandler(proxy_params))
response = opener.open(request)
將上述支援代理的功能整合到之前的連結爬蟲中,有以下程式碼:
import urllib.request import urllib.error import re #正規表示式 import urllib.parse #將url連結從相對路徑(瀏覽器可懂但python不懂)轉為絕對路徑(python也懂了) import urllib.robotparser #爬取資料前解析網站robots.txt檔案,避免爬取網站所禁止或限制的 def download(url, user_agent = "brain", proxy = None, num_retries = 2): #下載url網頁,proxy是支援代理功能,初始值為None,想要設定就直接傳引數即可 print("downloading:",url) header = {"user-agent": user_agent} #設定使用者代理,而不使用python預設的使用者代理Python-urllib/3.6 req = urllib.request.Request(url, headers = header) opener = urllib.request.build_opener() #為支援代理功能時刻準備著 if proxy: #如果設定了proxy,那麼就進行以下設定以實現支援代理功能 proxy_params = { urllib.parse.urlparse(url).scheme: proxy } opener.add_handler(urllib.request.ProxyHandler(proxy_params)) response = opener.open(req) try: html = urllib.request.urlopen(req).read() except urllib.error.URLError as e: #下載過程中出現問題 print("download error:",e.reason) html = None if num_retries > 0: #錯誤4XX發生在請求存在問題,而5XX錯誤則發生在服務端存在問題,所以在發生5XX錯誤時重試下載 if hasattr(e, "code") and 500<= e.code <600: return download(url, user_agent, num_retries-1) # recursively retry 5XX HTTP errors return html #download("http://example.webscraping.com") #訪問正常 #download("http://httpstat.us/500") #這個網頁測試用,一直是5XXerror #跟蹤連結的爬蟲 #link_crawler()函式傳入兩個引數:要爬取的網站URL、用於跟蹤連結的正規表示式。 def link_crawler(seed_url, link_regex): """先下載 seed_url 網頁的原始碼,然後提取出裡面所有的連結URL,接著對所有匹配到的連結URL與link_regex 進行匹配, 如果連結URL裡面有link_regex內容,就將這個連結URL放入到佇列中, 下一次 執行 while crawl_queue: 就對這個連結URL 進行同樣的操作。 反反覆覆,直到 crawl_queue 佇列為空,才退出函式。""" crawl_queue = [seed_url] seen = set(crawl_queue) #有可能連結中互相重複指向,為避免爬取相同的連結,所以我們需要記錄哪些連結已經被爬取過(放在集合seen中),若已被爬取過,不再爬取 while crawl_queue: url = crawl_queue.pop() rp = urllib.robotparser.RobotFileParser() #爬取前解析網站robots.txt,檢查是否可以爬取網站,避免爬取網站禁止或限制的 rp.set_url("http://example.webscraping.com/robots.txt") rp.read() user_agent = "brain" if rp.can_fetch(user_agent, url): #解析後發現如果可以正常爬取網站,則繼續執行 html = download(url) html = str(html) #filter for links matching our regular expression if html == None: continue for link in get_links(html): if re.match(link_regex, link): link = urllib.parse.urljoin(seed_url, link) #把提取的相對url路徑link(view/178)轉化成絕對路徑(/view/Poland-178)link if link not in seen: #判斷是否之前已經爬取 seen.add(link) #之前沒有的話加在集合中以便後續繼續判斷 crawl_queue.append(link) #之前沒有的話這個連結可用,放在列表中繼續進行爬取 else: print("Blocked by %s robots,txt" % url) continue def get_links(html): """用來獲取一個html網頁中所有的連結URL""" #做了一個匹配模板 webpage_regex,匹配 <a href="xxx"> or <a href='xxx'>這樣的字串,並提取出裡面xxx的URL,請注意這裡的xxxURL很可能是原始碼中相對路徑,eg view/1 正常訪問肯定是打不開的 webpage_regex = re.compile('<a href=["\'](.*?)["\']', re.IGNORECASE) return re.findall(webpage_regex,html) #return re.findall('<a[^>]+href=["\'](.*?)["\']', html)也可以這樣實現,但沒有上面的先編譯模板再匹配好 #只想找http://example.webscraping.com/index... or http://example.webscraping.com/view... link_crawler("http://example.webscraping.com", "/(index|view)")
相關文章
- 爬取網站前4_避免爬蟲陷阱網站爬蟲
- 爬取網站前3_下載限速網站
- 爬取網站前1_解析網站robots.txt檔案網站
- 爬蟲搭建代理池、爬取某網站影片案例、爬取新聞案例爬蟲網站
- python爬蟲實戰:爬取西刺代理的代理ip(二)Python爬蟲
- java爬取免費HTTP代理 code-for-funJavaHTTP
- 爬取網頁文章網頁
- node:爬蟲爬取網頁圖片爬蟲網頁
- 古詩網站前臺實現網站
- python爬取網圖Python
- 爬取網站新聞網站
- 爬蟲——網頁爬取方法和網頁解析方法爬蟲網頁
- 網路爬蟲怎麼使用ip代理爬蟲
- 爬蟲練習——爬取縱橫中文網爬蟲
- Python爬蟲爬取美劇網站Python爬蟲網站
- 使用代理池用py完整的爬取一個網站(尾部有github原始碼)網站Github原始碼
- python更換代理爬取豆瓣電影資料Python
- HTTP代理如何爬取?保姆式教程(附測試影片)HTTP
- 做網站前需要準備什麼網站
- ferret 爬取動態網頁網頁
- Puppeteer爬取網頁資料網頁
- 動態網站的爬取網站
- python網路爬蟲--爬取淘寶聯盟Python爬蟲
- Python爬蟲—爬取某網站圖片Python爬蟲網站
- 【Python爬蟲】正則爬取趕集網Python爬蟲
- Python爬蟲使用代理proxy抓取網頁Python爬蟲網頁
- 網路爬蟲---從千圖網爬取圖片到本地爬蟲
- 網站前端_jQuery-基礎入門網站前端jQuery
- 手機網站前端開釋出局技巧網站前端
- 最簡單的網路圖片的爬取 --Pyhon網路爬蟲與資訊獲取爬蟲
- 用PYTHON爬蟲簡單爬取網路小說Python爬蟲
- 網路爬蟲——爬取糗事百科笑料段子爬蟲
- 關於python爬取網頁Python網頁
- 拉勾網職位資料爬取
- 網路爬蟲之關於爬蟲 http 代理的常見使用方式爬蟲HTTP
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 如何高效獲取大資料?動態ip代理:用爬蟲!大資料爬蟲
- 用海外HTTP代理爬取海外資料的原理是什麼?HTTP