马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 MSK 于 2017-7-9 23:01 编辑
1.懂得约束自己的行为
无论如何,当你爬取一个网站的数据时,请记住自己是该网站的访客,应当约束自己的行为,否则对方可能封禁你的IP,甚至采取法律行动。
检查robots.txt
大多数网站都会定义robots.txt,让爬虫爬取时了解需要遵守哪些限制(对恶意爬虫好像没什么卵用 ,但是作为一个良好的网络公民应该遵守这些规则 )
百度的robots.txt的一部分 (www.baidu.com/robots.txt)
User-agent: EasouSpider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: *
Disallow: /
其中规定了禁止用户代理为 EasouSpider的爬虫爬取的链接,也规定了无论哪种用户,都禁止爬取网站(尽管自身就是一个爬虫业务 )
在有的robots.txt中还会定义sitemap(网站地图)文件,它提供了一个网页的所有链接
2.估算网站大小
目标网站的大小会影响我们如何爬取
一个简便的方法:检查Baidu爬虫的结果,Baidu爬虫可能已经爬过我们感兴趣的网页
方法:在浏览器地址栏输入:site: 网址
3.查询网站所有者
在www.whois.org可以获取到相关网站的信息
4.下载网页
使用urllib库来下载网页
from urllib.request import *
def download(url):
html = urlopen(url).read()
doenload('http://www.baidu.com')
#下载网页并返回其html
但是下载网页时,总会遇到一些无法控制的错误,比如请求的资源不存在的404错误,还有傲娇的403错误
推荐阅读:http状态码大全
[size=3]重试下载
有的错误是临时性的,如5xx 类错误发生在服务端出现问题时
所以当发生5xx错误时,只需重试下载即可
import urllib.request
import urllib.error
def download(url,try_again=2):
try:
print('downloading %s...' % url)
html = urllib.request.urlopen(url).read()
except urllib.error.URLError as e:
html = None
print(e.reason)
if try_again > 0:
if hasattr(e,'code') and 500 <= e.code < 600:
print('下载失败,正在重试下载...')
return download(url,try_again - 1)
return html
url = input('input url please:')
download(url)
5.自动检查robots.txt文件,避免爬取禁止的链接
使用urllib.robotparser
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url('http://www.baidu.com/robots.txt')
rp.read()
user_agent = 'python3.6.1'
url = 'https://baike.baidu.com/'
#返回一个bool值,意思是是否能爬取
rp.can_fetch(user_agent,url)
因为scrapy目前已经支持python3 本系列使用语言均为 python3
|