上次完成的url爬取項(xiàng)目并不能滿足需求,在此完成了一個(gè)更為強(qiáng)大的爬取代碼,有需要的可以直接運(yùn)行,根據(jù)自己爬取的網(wǎng)站更改部分正則和形參即可。前排提示:運(yùn)行需要耐心,因?yàn)閹浊€(gè)url爬完的話,還是建議花生瓜子可樂電影準(zhǔn)備好。
下面是代碼,代碼有注釋,很容易理解。
注意:爬蟲代碼每過一段時(shí)間就 需要更新,因?yàn)榕赖臇|西在變,所以可能過一段時(shí)間就要更新爬蟲。
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 29 14:01:28 2018
@author: ESionJL數(shù)據(jù)貓
question:1.當(dāng)前url若爬取到的pagelinks為[],則將其移除visited列表。
2.spiderpage()函數(shù)中,當(dāng)前url爬取到的網(wǎng)頁為UNknown,會(huì)報(bào)錯(cuò),如何規(guī)避,并將此url移除。
3.返回title為空
4.網(wǎng)站不可加載
5.過期網(wǎng)站,垃圾網(wǎng)站
"""
import re
import requests
from bs4 import BeautifulSoup
from urllib import request
from urllib import error
#此測試首頁是否可以鏈接
def url_get(num_retries=5):
# url = input("請輸入要爬取的首頁url:")
url = "http://"
# url = "http://"
try:
# 做一個(gè)user-agent模擬瀏覽器發(fā)送請求,也可以加入其它字段
kv = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko'}
requests.get(url, headers=kv)
return url
except error.URLError or error.HTTPError as e:
if num_retries > 0:
if hasattr(e,'code') and 500 <= e.code < 600:
url_get(num_retries-1)
print("url無法連接")
#此函數(shù)用于提取各鏈接網(wǎng)站下的所有鏈接
def spiderpage(url):
try:
kv = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'}
r = requests.get(url, headers=kv)
r.encoding = r.apparent_encoding
pagetext = r.text
# 正則表達(dá)式表示要爬取的是
1:
print(f"第{x-1}個(gè)url,開始爬")
visitedurl = self.linkQuence.unvisitedurldequence() # 從未訪問列表中pop出一個(gè)url
if visitedurl is None or visitedurl == '':
continue
title = getTitle(visitedurl)
if re.findall("新華保險(xiǎn)",title): #如果跳出本站則pass
initial_links = spiderpage(visitedurl) # 爬出該url頁面中所有的鏈接
right_links = url_filtrate(initial_links) # 篩選出合格的鏈接
if not right_links:
pass
else:
self.linkQuence.addvisitedurl(visitedurl) # 將該url放到訪問過的url隊(duì)列中
for link in right_links: # 將篩選出的鏈接放到未訪問隊(duì)列中
self.linkQuence.addunvisitedurl(link)
x += 1
else:
pass
print(f"爬完了")
return self.linkQuence.visited
#寫文件函數(shù)
def writetofile(urllist):
#寫入網(wǎng)站并計(jì)數(shù)
x=1
for url in urllist:
# Furls.txt用于保存鏈接
file = open('Furls.txt', 'a', encoding='utf8')
file.write(f'{url}\n')
x += 1
file.close()
print(f'寫入已完成,總計(jì){x-1}個(gè)網(wǎng)頁的子鏈接')
#主循環(huán)
if __name__ == '__main__':
url = url_get()
spider = Spider(url)
#傳入要爬取的子鏈接數(shù)量
urllist = spider.crawler(5000)
writetofile(urllist)
還是希望大家自己學(xué)會(huì)比較好,只是粘貼畢竟學(xué)不到東西,這個(gè)主題框架不是我寫的,但是真正的實(shí)現(xiàn)函數(shù)都是我自己一點(diǎn)一點(diǎn)寫的,遇到很多困難也都解決了,能學(xué)到不少東西。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
