手机之家 证书_Scrapy 某车之家口碑爬虫

本文介绍了一种通过抓包工具Charles绕过字体反爬虫技术的方法,实现了从汽车之家APP抓取汽车口碑数据的过程。文章详细展示了如何利用Python Scrapy框架及Redis实现数据抓取与分布式处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5f1eaee3ab01173fa3db4bee167a50f1.png

作为教科书级别的某车之家的字体反爬,这篇里面没研究这个 ,绕过了字体反爬

之前为了爬取某车之家的口碑内容,因为有字体反爬

先研究了一下猫眼电影的字体反爬 https://zhuanlan.zhihu.com/p/76636123

我想思路差不多,后来了解到,貌似某车之家的字体反爬不同页面,对应多个字体库,就放弃了

ce737c2dca43cf4f7e5dbd987674be35.png

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

372a1daf4a8626f89d26a16a556b812f.png

经过观察 链接最后k2557745 中数字为这条口碑的id 这个链接里则包含了我们需要的这条口碑里面各种数据

接下来就是要找到口碑id列表的链接即可

  • 利用Charles抓包,发现链接,例如 https://koubei.app.autohome.com.cn/autov8.3.5/alibi/seriesalibiinfos-pm2-ss19-st0-p1-s20-isstruct0-o0.json

cf12d2bcce5476d156c9fa080591092f.png

发现链接其中 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
  1. 链接根据大写字母构造
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里面的数据,如下图:

7cc5312783d66e813deb238b51581c5e.png

其中上面的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中

b514b39f70b891f74d0411ff98a03c0d.png

bbbe07a554dfe5dbf4dac29089147b47.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值