Skip to content

sadjjk/jdGoodsSpider

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

项目过程

工具

  • Pycharm
  • Xshell
  • Python 3.6
  • 阿里云Centos 7

2.Scrapy爬虫代码(京东搜索零食)

强烈推荐公众号 皮克啪的铲屎官 此部分代码基本都来自他发布的文章《PeekpaHub》 全栈开发 不仅仅是爬虫 服务器的配置等都是从这里学习的 当然除了京东爬虫外 他还有很多有意思的爬虫 关注有惊喜 感谢作者皮克啪的铲屎官的提供的帮助和学习

下面是我一些补充 talking is short show me your code 废话少说 放码过来 京东零食爬虫Github

爬虫主要文件 jdSpider.py

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

这个文件最简单了 定义一下就好了 没什么说的

这里MONGO_URL会在settings.py中申明 实际填的就是服务器内网IP 一旦填了服务器内网IP后 上传到服务器中运行 是没有问题的 但在本地是无法跑通测试这个项目的 会报数据库连接不上的错误 要想成功在本地测试项目代码 两种修改:

  • MONGO_URL改成localhost本地 并且本地要安装MongoDB并启动
  • 依然连接服务器中MongoDB 存储到服务器的MongoDB数据库中 不过代码上要做如下修改 添加ssh跳转 下载三方库sshtunnel 填写公网IP、用户名、密码和内网IP 在打开和关闭数据库的时候 要添加self.server.start()self.server.stop()其他保持不变 这样就可以在本地运行爬虫 并保存在服务器中的MongoDB中 注意:若这个项目要上传到服务器中 在服务器中运行 则不用做修改

尤其是在云服务器上运行时 要保证爬虫的健壮稳定 中间件需要增加很多异常处理 就要防止爬虫各种意外排取失败 常用三招:

  • 第一招:随机使用各种各样的User-Agentagents就是一系列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重连 简单粗暴

爬虫三招全都用上 基本上都能顺利爬取

最后一个文件 这个就非常简单 简单的设置下

  • 默认遵守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
#超时时间20s
DOWNLOAD_TIMEOUT = 20
#下载延迟1s
DOWNLOAD_DELY = 1
#服务器mongodb内网IP
MONGO_URL = 'mongodb://XXX.XX.XXX.XX/'
#数据库表名
MONGO_DB = 'JD'
Scrapy代码部分就结束了

Github源码

About

京东爬虫

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages