上次完成的url爬取项目并不能满足需求,在此完成了一个更为强大的爬取代码,有需要的可以直接运行,根据自己爬取的网站更改部分正则和形参即可。前排提示:运行需要耐心,因为几千个url爬完的话,还是建议花生瓜子可乐电影准备好。
下面是代码,代码有注释,很容易理解。
注意:爬虫代码每过一段时间就 需要更新,因为爬的东西在变,所以可能过一段时间就要更新爬虫。
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 29 14:01:28 2018
@author: ESionJL数据猫
question:1.当前url若爬取到的pagelinks为[],则将其移除visited列表。
2.spiderpage()函数中,当前url爬取到的网页为UNknown,会报错,如何规避,并将此url移除。
3.返回title为空
4.网站不可加载
5.过期网站,垃圾网站
"""
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:
# 做一个user-agent模拟浏览器发送请求,也可以加入其它字段
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无法连接")
#此函数用于提取各链接网站下的所有链接
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
# 正则表达式表示要爬取的是
1:
print(f"第{x-1}个url,开始爬")
visitedurl = self.linkQuence.unvisitedurldequence() # 从未访问列表中pop出一个url
if visitedurl is None or visitedurl == '':
continue
title = getTitle(visitedurl)
if re.findall("新华保险",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队列中
for link in right_links: # 将筛选出的链接放到未访问队列中
self.linkQuence.addunvisitedurl(link)
x += 1
else:
pass
print(f"爬完了")
return self.linkQuence.visited
#写文件函数
def writetofile(urllist):
#写入网站并计数
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'写入已完成,总计{x-1}个网页的子链接')
#主循环
if __name__ == '__main__':
url = url_get()
spider = Spider(url)
#传入要爬取的子链接数量
urllist = spider.crawler(5000)
writetofile(urllist)
还是希望大家自己学会比较好,只是粘贴毕竟学不到东西,这个主题框架不是我写的,但是真正的实现函数都是我自己一点一点写的,遇到很多困难也都解决了,能学到不少东西。