
作为教科书级别的某车之家的字体反爬,这篇里面没研究这个 ,绕过了字体反爬
之前为了爬取某车之家的口碑内容,因为有字体反爬
先研究了一下猫眼电影的字体反爬 https://zhuanlan.zhihu.com/p/76636123
我想思路差不多,后来了解到,貌似某车之家的字体反爬不同页面,对应多个字体库,就放弃了

emmm...
后来利用Charles,从汽车之家安卓客户端抓包,非常愉快简单的解决了这个问题~
(大佬请忽略,小白的心路历程,当然过程并不简单,由于之前没有用过Fiddler、Charles这类的抓包工具,同时安装了Fiddler、Charles, 感觉Charles界面漂亮一点,听说功能也更强大,在百度了安装教程之后,配置了 证书,ip,端口号,同一局域网下,关闭win10防火墙等一系列操作,恭喜自己,还是抓不到手机的https 显示为unkonwn,后来经过大佬指点,Charles抓不到包是因为:Android7以上的系统无法对第三方https的App进行抓包,因为7.0以上版本设置了安全策略,不再信任用户自己添加的认证证书,大佬推荐我电脑下个安卓模拟器,原谅我本来以为模拟器只是为了,在电脑上玩手机游戏更爽一点而存在的,没想到也能安装其他的app应用,就是这样,嗯~ o(* ̄▽ ̄*)o,可以参考这个https://www.jianshu.com/p/1d0360e50a01,另外设置中 SSl Proxying ->Location add 443)
- 利用Charles从汽车之家安卓客户端抓包,发现了,比如这样的链接 https://koubei.app.autohome.com.cn/autov8.3.5/alibi/alibiinfobase-pm2-k2557745.json

经过观察 链接最后k2557745 中数字为这条口碑的id 这个链接里则包含了我们需要的这条口碑里面各种数据
接下来就是要找到口碑id列表的链接即可
- 利用Charles抓包,发现链接,例如 https://koubei.app.autohome.com.cn/autov8.3.5/alibi/seriesalibiinfos-pm2-ss19-st0-p1-s20-isstruct0-o0.json

发现链接其中 ss19 代表车系id (seriesid:19), st0-p1-s20 p1代表现在是第一页,每个页面包含20条口碑信息,包含口碑id ;页面中 pagecount 代表总页数
这样我们构造url即可
还差一个车系id 比如上面那个 ss19 如果知道了车系id就拥有了一切
- 车系id在这里 例如https://www.autohome.com.cn/grade/carhtml/A.html
- 链接根据大写字母构造
start_urls = ['http://www.autohome.com.cn/grade/carhtml/{}.html'.format(chr(ord('A') + i)) for i in range(26)]
ok
我们从上面这页面里拿到车系id
2. 根据车系id 拼接url
koubei_url = 'https://koubei.app.autohome.com.cn/autov8.3.5/alibi/seriesalibiinfos-pm2-ss{}-st0-p1-s20-isstruct0-o0.json'
在这个页面里 拿到 口碑id
3. 根据口碑id 拼接url
koubei_info_url = 'https://koubei.app.autohome.com.cn/autov8.3.5/alibi/alibiinfobase-pm2-k{}.json'
在这里获取口碑信息
代码
import scrapy
from scrapy import Request
from ..items import AutohomespiderItem
class AutohomeSpiderSpider(scrapy.Spider):
name = 'autohome_spider'
custom_settings = {
'CONCURRENT_REQUESTS': 16,
'DOWNLOAD_DELAY': 1,
'DEFAULT_REQUEST_HEADERS': {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0',
'Accept': "*/*",
'Cache-Control': "no-cache",
'accept-encoding': "gzip, deflate",
'cache-control': "no-cache",
},
'REDIS_HOST': '127.0.0.1',
'REDIS_PORT': '6379',
'REDIS_DB': '0',
'ITEM_PIPELINES': {
'AutohomeSpider.pipelines.RedisStartUrlsPipeline': 301,
},
}
start_urls = ['http://www.autohome.com.cn/grade/carhtml/{}.html'.format(chr(ord('A') + i))
for i in range(26)]
# start_urls =['https://www.autohome.com.cn/grade/carhtml/A.html']
def start_requests(self):
for url in self.start_urls:
yield Request(url, callback=self.parse, dont_filter=True)
def parse(self, response):
for node in response.xpath('//li[@id]'):
item = AutohomespiderItem()
seriesid = node.xpath('./@id').extract()[0][1:]
item['url'] = 'https://koubei.app.autohome.com.cn/autov8.3.5/alibi/seriesalibiinfos-pm2-ss{}-st0-p1-s20-isstruct0-o0.json'.format(seriesid)
yield item
这里面获取车系id后 直接构造了 口碑id列表的链接 ,然后存放到redis中
另一个爬虫为消费者,从redis中读取这些链接,解析详情数据;所有配置文件都是爬虫中的custom_settings中,可以自定义
autohome_spider: 这个爬虫是生产者(上面那个),运行之后,在你的redis服务器中会出现 koubei_spider:start_urls,即种子链接
koubei_spider: 这个爬虫是消费者(下面这个),运行之后会消费redis里面的数据,如下图:

其中上面的url 直接yield Request(url)到下一个parse,岂不美哉,对我这里只是为了熟悉一下 scrapy_redis 用法,看看是否能愉快的跑起来,因为打算研究研究分布式
import json
import re
from scrapy import Request
from scrapy_redis.spiders import RedisSpider
from ..items import KoubeispiderItem
class KoubeiSpiderSpider(RedisSpider):
name = 'koubei_spider'
# allowed_domains = ['autohome.com.cn']
koubei_url = 'https://koubei.app.autohome.com.cn/autov8.3.5/alibi/seriesalibiinfos-pm2-ss{}-st0-p1-s20-isstruct0-o0.json'
koubei_info_url = 'https://koubei.app.autohome.com.cn/autov8.3.5/alibi/alibiinfobase-pm2-k{}.json'
custom_settings = {
'CONCURRENT_REQUESTS': 32,
'DOWNLOAD_DELAY': 0.1,
'DEFAULT_REQUEST_HEADERS': {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16A366 MicroMessenger/6.7.3(0x16070321) NetType/WIFI Language/zh_CN',
'Accept': "*/*",
'Cache-Control': "no-cache",
'accept-encoding': "gzip, deflate",
'cache-control': "no-cache",
},
'MONGO_URI': '127.0.0.1:27017',
'MONGO_DATABASE': 'koubei',
'REDIS_START_URLS_AS_SET': True,
'ITEM_PIPELINES': {
'AutohomeSpider.pipelines.MongoPipeline': 301,
},
}
def parse(self, response):
"""
口碑列表
"""
if re.findall('st0-p1-s20', response.url):
# 如果是第1页,一次性获取后面的所有页
result = json.loads(response.text)
pagecount = result.get('result').get('pagecount')
if pagecount:
pagecount = int(pagecount)
for page_num in range(2, pagecount + 1):
page_url = response.url.replace('st0-p1-s20', 'st0-p{}-s20'.format(page_num))
yield Request(page_url, self.parse, dont_filter=True,
# headers={'User-Agent': self.mobile_ua, 'Referer': response.url}
)
"""
解析本页的数据 获取 Koubeiid
"""
result = json.loads(response.text)
data_list = result.get('result').get('list')
for node in data_list:
Koubeiid = node.get('Koubeiid')
yield Request(self.koubei_info_url.format(Koubeiid), callback=self.parse_koubei,
meta={'Koubeiid': Koubeiid}, dont_filter=True)
def parse_koubei(self, response):
"""
口碑详情页
"""
item = KoubeispiderItem()
result = json.loads(response.text)
item['Koubeiid'] = response.meta['Koubeiid']
item['memberid'] = result.get('result').get('memberid')
item['membername'] = result.get('result').get('membername')
item['brandid'] = result.get('result').get('brandid')
item['brandname'] = result.get('result').get('brandname')
item['seriesid'] = result.get('result').get('seriesid')
item['seriesname'] = result.get('result').get('seriesname')
item['specid'] = result.get('result').get('specid')
item['specname'] = result.get('result').get('specname')
item['lastedit'] = result.get('result').get('lastedit')
item['commentcount'] = result.get('result').get('commentcount')
item['helpfulcount'] = result.get('result').get('helpfulcount')
item['visitcount'] = result.get('result').get('visitcount')
content = result.get('result').get('content').replace('rn','')
content = ''.join([x.strip() for x in content])
item['content'] = content
yield item
并没有把 所有的字段数据添加上,自行添加;并没有设置代理ip,跑了一下程序,运行的很愉快;数据存到mongodb中


Github源码:https://github.com/Ingram7/AutohomeSpider