php 爬虫 超市,scrapy爬虫 爬取天猫进口零食网页

出于某些原因,想调戏下天猫的反爬虫机制,于是就有了这篇记录

源码已传osgit ,感兴趣可以戳下

正文开始

分析目标(items) 解析路径(xpath)

目标为天猫超市的进口商品区

研究一下待抓取网页中, 需要爬的内容,如下图

986559d92acedc09c830f915944f8059.png

我的目标是 商品名、销量、价格,图当然也是可以爬的,不过本次不爬

b3a9d73ac94bb8a45cfbcd6388d1d158.png

新建爬虫【处理items,pipelines,settings,spider】

首先新建一个爬虫,起个喜欢或者任性的名字

scrapy startproject tmail

更改下级目录中的 **items.py **

我依据网站上的起名添加了 titile,sold(sum是保留字),price

3d2b35fe5bab86a22688cbecd774cf59.png

更改pipelines.py和settings.py中的内容(当然也可以先创小蜘蛛啦)

因为爬的都是字符,就直接保存为json文件(下图为初版,后遇到问题有更改)

95924f655256901ae7e4f29fd68e885e.png

在setting.py中添加download_delay和 item_pipelines

DOWNLOAD_DELAY = 3

ITEM_PIPELINES = {

'tmail.pipelines.TmailPipeline' : 300,

}

事实上我还加了COOKIES_ENABLED = False,后来证明。。是傻,见后文

接下来就是愉快得整蜘蛛了

在spiders文件夹中新建一个xxx.py (我的是tmailspider.py),打开之

加 name(运行爬虫时用) ,allowed_domains (域名),

start_url(必需吐槽下天猫的后缀在下个菜鸡看不懂,并且用虚拟机开的不一样,不过都能用就是了,我的 在图中隐藏了部分,各位喜欢自己开个就好)

6e30dedb8ce16c94b0ffc6a58e2746a0.png

分析目标xpath,加parse方法 下图为最初版

52110c05d3eb0a99cfdf9b2b4fcf5c99.png

试运行,处理bug【robots.txt,更改useragent(无用),重定向302错误】

嗯 接下来 我就运行了 scrapy crawl tmail.com

结果如图 我被robots.txt文件挡住了

c384f2e9f8ecaa2b25393b30b7d0fc4f.png

看来不能优雅了,第一次更改 settings.py 中 加/改 ROBOTSTXT_OBEY = False

改完后,来我们看看结果

2a8e33619e726def9466b55944662f21.png

重定向302??这是什么鬼 ?看出我是用爬虫了 ?

没事,前两天才学了改请求头,我加个变化的useragent试试 (这个可以看看我的上一篇博客)

改useragent

然并卵,它报同样!的!错!

好吧,老实上网搜,

分析cookies

网上并没有详细方法,只有几个朋友提供的分析cookies的思路

然而我并不会,于是就找到一篇对我接下来的修改起很大作用的文章 Scrapy用Cookie实现模拟登录

方法如下:

登录了自己的天猫,用ctrl + shift + i 快捷键打开工具,在network下找到需要的cookie(真 好长一串)

拿到cookie后需要处理成``` 'xxx' : 'xxxx',

2. 重载spider内方法start_requests(注意:此时start_urls已废,我保留它仅为了保存原网址)

![start_request1](https://static.oschina.net/uploads/img/201609/02170927_V4Zi.png "重写1")

3. 中间是很长的cookies,因为start_urls没有默认功能了,所以要重新加上调用方法parse

![start_request2](https://static.oschina.net/uploads/img/201609/02170858_kQ4B.png "重写2")

4. (自作孽之)记得把settings.py中的 COOKIES_ENABLED = False 改为

COOKIES_ENABLED = True //默认为True

到此就可以正常爬取了,还有最后一个问题 输出中文乱码

### 解决中文乱码

这个我算是暴力解决了,在 tmailspider.py和pipelines.py 中加入

import sys reload(sys) sys.setdefaultencoding('utf-8')

然后输出变为unicode,于是在pipeline里加了

line.decode('unicode-escape')

### 收尾工作(输出好看点以及实现爬取下一页)

由于单网页有多个item,于是我改写了爬虫的parse函数,可以单个输出,下图为改善版

![parse](https://static.oschina.net/uploads/img/201609/02173204_pBoq.png "parse改善版")

上面所完成的爬虫只能爬单个网页,那怎么够,于是又去分析网页内地址

![page](https://static.oschina.net/uploads/img/201609/02173600_DJbf.png "page-next")

可以看出网址很烦,一开始想用正则来表达网址,结果嫌麻烦放弃了,我看中了上图最后一条,下一页的网址,哈哈,用xpath分析获得很容易,于是最终版的parse函数如下

![parse最终](https://static.oschina.net/uploads/img/201609/02173930_AkMl.png "parse最终版")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值