原作者是使用BeautifulSoup进行html解析 我觉还是用xpath更方便简洁一些 于是改写成了xpath解析 实现的最终效果是一样的
还有个地方可以提一下
通常都是这么写 在items定义好后一个一个赋值上去
可以改成如下更简洁(这种写法出自廖雪峰老师的爬虫教程 也感谢这位老师 )
for field in goods.fields: try: goods[field] = eval(field) except NameError: self.logger.debug("Field is Not Defined " + field) yield goods
items.py
这个文件最简单了 定义一下就好了 没什么说的
piplines.py
这里MONGO_URL
会在settings.py中申明 实际填的就是服务器内网IP
一旦填了服务器内网IP后 上传到服务器中运行 是没有问题的 但在本地是无法跑通测试这个项目的 会报数据库连接不上的错误
要想成功在本地测试项目代码 两种修改:
MONGO_URL改成localhost本地 并且本地要安装MongoDB并启动
依然连接服务器中MongoDB 存储到服务器的MongoDB数据库中 不过代码上要做如下修改 添加ssh跳转
下载三方库sshtunnel 填写公网IP、用户名、密码和内网IP 在打开和关闭数据库的时候 要添加self.server.start()
和self.server.stop()
其他保持不变 这样就可以在本地运行爬虫 并保存在服务器中的MongoDB中
注意:若这个项目要上传到服务器中 在服务器中运行 则不用做修改
middiewares.py
尤其是在云服务器上运行时 要保证爬虫的健壮稳定
中间件需要增加很多异常处理 就要防止爬虫各种意外排取失败
常用三招:
第一招:随机使用各种各样的User-Agent
agents就是一系列User-Agent列表 可自行百度 也可使用如下
agents = [ "Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5", "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7", "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10", ]
第二招:使用Cookies
这里不使用Cookies也能抓取 故暂未添加第三招:使用代理IP
尤其是京东搜索屏蔽了阿里云的IP 所以不得不使用代理IP 要使用代理IP 就需要构建代理池 代理池的构建下一篇再讲 这里直接调用已经生成好的代理IP地址
需要导入各种可能导致异常的方法首先在获取网页时就使用代理IP
然后捕获状态码异常 再更换IP 常见的错误状态码503,110,111(可自行添加) 或者甭管什么状态码只要不是200 就更换IP重连最后还是可能会报异常错误如超时错误
twisted.internet.error .TimeoutError
等等(免费的代理IP就是问题多) 依然甭管什么错 通通更换IP重连 简单粗暴
爬虫三招全都用上 基本上都能顺利爬取
settings.py
最后一个文件 这个就非常简单
简单的设置下
默认遵守robots协议 修改为
False
ROBOTSTXT_OBEY = False
开启中间件
DOWNLOADER_MIDDLEWARES = { 'jdGoodsSpider.middlewares.UserAgentMiddleware': 543, 'jdGoodsSpider.middlewares.ProxyMiddleware': 200, }
开启pipelines
ITEM_PIPELINES = { 'jdGoodsSpider.pipelines.MongoPipeline': 300, }
# 爬取最大页数MAX_PAGE_NUM = 100#开始页START_URL = ['https://search.jd.com/Search?keyword=%E9%9B%B6%E9%A3%9F&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=lingshi&stock=1&click=0&page=1']#禁止重定向REDIRECT_ENABLED = False#超时时间20sDOWNLOAD_TIMEOUT = 20#下载延迟1sDOWNLOAD_DELY = 1#服务器mongodb内网IPMONGO_URL = 'mongodb://XXX.XX.XXX.XX/'#数据库表名MONGO_DB = 'JD'
作者:丨像我这样的人丨
链接:https://www.jianshu.com/p/022c88c4a8b3
共同学习,写下你的评论
评论加载中...
作者其他优质文章