手记

Scrapy-02(系列篇3)-爬虫&云服务器定时调度(以京东零食为例)


原作者是使用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

0人推荐
随时随地看视频
慕课网APP