精华内容
下载资源
问答
  • 抖音用户信息爬取案例

    万次阅读 多人点赞 2019-06-17 17:27:12
    如果有用,还请点赞或者留言 import re import requests from lxml import etree ''' 抖音用户基本信息 -> 请求share来获取数据 ''' def handle_decode(input_data): # 匹配icon font regex_list = [ {'name': [' ...


    注意:

    之前的代码已经失效,暂时先不删除。

    可根据目录直接到页面最底部查看最新采集方法。


    2019年6月17更新(已失效)

    抓包。抓到了一个share_url
    在这里插入图片描述
    在这里插入图片描述
    我访问过去看了下,https://www.iesdouyin.com/share/user/102064772608?
    在这里插入图片描述
    有数据的。那就拿数据。

    然后发现它的数字做了字符集映射。
    在这里插入图片描述
    搞他。

    下载.ttf的文件,s3a.bytecdn.cn/ies/resource/falcon/douyin_falcon/static/font/iconfont_da2e2ef.ttf,这个便用font creator软件打开,看到这个图片我们就明白了字体与数字的关系
    在这里插入图片描述
    既然我们看到num_对应数字1,num_8对应数字7,那这个num_8们怎么得到,与‘ ’有啥关系?

    2.这个时候,需要大家安装pip install fontTools,使用fontTool打开ttf文件转化成xml文件,

    采用下面代码

    from fontTools.ttLib import TTFont
    font_1 = TTFont('douyin.ttf')
    font_1.saveXML('font_1.xml')
    

    我们看到了font_1.xml,

    在这里插入图片描述
    这就能看出来了。

    import re
    def getDouyinNum(douIDNumCode):
        mapCode2Font = {
            '0xe602': 'num_',
            '0xe603': 'num_1',
            '0xe604': 'num_2',
            '0xe605': 'num_3',
            '0xe606': 'num_4',
            '0xe607': 'num_5',
            '0xe608': 'num_6',
            '0xe609': 'num_7',
            '0xe60a': 'num_8',
            '0xe60b': 'num_9',
            '0xe60c': 'num_4',
            '0xe60d': 'num_1',
            '0xe60e': 'num_',
            '0xe60f': 'num_5',
            '0xe610': 'num_3',
            '0xe611': 'num_2',
            '0xe612': 'num_6',
            '0xe613': 'num_8',
            '0xe614': 'num_9',
            '0xe615': 'num_7',
            '0xe616': 'num_1',
            '0xe617': 'num_3',
            '0xe618': 'num_',
            '0xe619': 'num_4',
            '0xe61a': 'num_2',
            '0xe61b': 'num_5',
            '0xe61c': 'num_8',
            '0xe61d': 'num_9',
            '0xe61e': 'num_7',
            '0xe61f': 'num_6',
        }
        mapFont2Num = {
            'num_': 1,
            'num_1': 0,
            'num_2': 3,
            'num_3': 2,
            'num_4': 4,
            'num_5': 5,
            'num_6': 6,
            'num_7': 9,
            'num_8': 7,
            'num_9': 8,
        }
        douIDNum = ''
        map1 = {}
        if douIDNumCode == '':
            return ''
        for i in douIDNumCode:
            j = i.replace(' &#', '0').replace('; ', '')
            map1[j] = str(mapFont2Num[mapCode2Font[j]])
        return map1
    
    def req(share_id):
        url2= 'https://www.iesdouyin.com/share/user/{}'.format(share_id)
        headers ={
            "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) "
                         "AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/74.0.3729.169 Safari/537.36"
                }
        res=requests.get(url2,verify=False,headers=headers)
        return res
    
    def parse(res):
        description_header = re.findall('抖音ID:     (.*?)   </p>',res.text,re.S)
        description_back = re.findall('<i class="icon iconfont ">(.*?)</i>',res.text,re.S)
        mapDict = getDouyinNum(douIDNumCode=description_back)
        res = description_header[0]
        for i,j in mapDict.items():
            res = res.replace('<i class="icon iconfont "> &#'+i[1:]+'; </i>',j)
        print(res)
    
    
    if __name__ == '__main__':
        res =  req(102064772608)
        parse(res)
    

    在这里插入图片描述
    在这里插入图片描述

    2019年8月更新(已失效)

    检测到最近很多同学都在看这篇文章,我就重新写了一遍,思路还是跟上面一样,这次获取的是所有的用户信息。

    在这里插入图片描述
    如果有用,还请点赞或者留言

    import re
    import requests
    from lxml import etree
    '''
                             抖音用户基本信息 -> 请求share来获取数据 
    '''
    
    def handle_decode(input_data):
        # 匹配icon font
        regex_list = [
            {'name': [' &#xe603; ', ' &#xe60d; ', ' &#xe616; '], 'value': 0},
            {'name': [' &#xe602; ', ' &#xe60e; ', ' &#xe618; '], 'value': 1},
            {'name': [' &#xe605; ', ' &#xe610; ', ' &#xe617; '], 'value': 2},
            {'name': [' &#xe604; ', ' &#xe611; ', ' &#xe61a; '], 'value': 3},
            {'name': [' &#xe606; ', ' &#xe60c; ', ' &#xe619; '], 'value': 4},
            {'name': [' &#xe607; ', ' &#xe60f; ', ' &#xe61b; '], 'value': 5},
            {'name': [' &#xe608; ', ' &#xe612; ', ' &#xe61f; '], 'value': 6},
            {'name': [' &#xe60a; ', ' &#xe613; ', ' &#xe61c; '], 'value': 7},
            {'name': [' &#xe60b; ', ' &#xe614; ', ' &#xe61d; '], 'value': 8},
            {'name': [' &#xe609; ', ' &#xe615; ', ' &#xe61e; '], 'value': 9},
        ]
    
        for i1 in regex_list:
            for i2 in i1['name']:
                input_data = re.sub(i2, str(i1['value']), input_data)       # 把正确value替换到自定义字体上
    
        html = etree.HTML(input_data)
        douyin_info = {}
        # 获取昵称
        douyin_info['nick_name'] = html.xpath("//div[@class='personal-card']/div[@class='info1']//p[@class='nickname']/text()")[0]
        # 获取抖音ID
        douyin_id = html.xpath("//div[@class='personal-card']/div[@class='info1']/p[@class='shortid']//text()")
        douyin_info['douyin_id'] = ''.join(douyin_id).replace('抖音ID:', '').replace(' ', '')
    
        # 职位类型
        try:
            douyin_info['job'] = html.xpath("//div[@class='personal-card']/div[@class='info2']/div[@class='verify-info']/span[@class='info']/text()")[0].strip()
        except:
            pass
        # 描述
        douyin_info['describe'] = html.xpath("//div[@class='personal-card']/div[@class='info2']/p[@class='signature']/text()")[0].replace('\n', ',')
        # 关注
        douyin_info['follow_count'] = html.xpath("//div[@class='personal-card']/div[@class='info2']/p[@class='follow-info']//span[@class='focus block']//i[@class='icon iconfont follow-num']/text()")[0].strip()
        # 粉丝
        fans_value = ''.join(html.xpath("//div[@class='personal-card']/div[@class='info2']/p[@class='follow-info']//span[@class='follower block']//i[@class='icon iconfont follow-num']/text()"))
        unit = html.xpath("//div[@class='personal-card']/div[@class='info2']/p[@class='follow-info']//span[@class='follower block']/span[@class='num']/text()")
        if unit[-1].strip() == 'w':
            douyin_info['fans'] = str(float(fans_value) / 10) + 'w'
        else:
            douyin_info['fans'] = fans_value
        # 点赞
        like = ''.join(html.xpath("//div[@class='personal-card']/div[@class='info2']/p[@class='follow-info']//span[@class='liked-num block']//i[@class='icon iconfont follow-num']/text()"))
        unit = html.xpath("//div[@class='personal-card']/div[@class='info2']/p[@class='follow-info']//span[@class='liked-num block']/span[@class='num']/text()")
        if unit[-1].strip() == 'w':
            douyin_info['like'] = str(float(like) / 10) + 'w'
        else:
            douyin_info['like'] = like
    
        return douyin_info
    
    
    def handle_douyin_info(url):
        header = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
        }
        response = requests.get(url=url, headers=header)
        return handle_decode(response.text)
    
    if __name__ == '__main__':
        url = 'https://www.amemv.com/share/user/102064772608'     # 抖音新分享页的链接
        #url = 'https://www.iesdouyin.com/share/user/102064772608'
        print(handle_douyin_info(url))
    

    2020年6月24更新

    抖音更新了分享页面,现在分为了两版:

    在这里插入图片描述

    2021/03/03更新

    用户信息还可以使用上面的接口。

    分享页面用户信息接口https://www.iesdouyin.com/web/api/v2/user/info/

    分享页面用户视频数据https://blog.csdn.net/weixin_43582101/article/details/114291365


    ps:

    Fiddler抓取抖音视频数据:https://blog.csdn.net/weixin_43582101/article/details/89600007

    抖音热搜和话题对应数据:https://blog.csdn.net/weixin_43582101/article/details/103791795

    unidbg生成xgorgon:https://blog.csdn.net/weixin_43582101/article/details/108012579

    抖音xgorgon(0401) :https://blog.csdn.net/weixin_43582101/article/details/107365977

    展开全文
  • 拼多多商品信息爬取

    万次阅读 热门讨论 2019-02-28 17:28:21
    拼多多商品信息爬取 爬取完几个主流电商平台的信息,今天想着也去攻克一下拼多多。于是先去GitHub上面找一下有没有哪位大神搞过了借鉴一下,然后果然发现一个好用的接口。 想着既然找到了就先下载下来跑一下,嗯。。...

    拼多多商品信息爬取

    爬取完几个主流电商平台的信息,今天想着也去攻克一下拼多多。于是先去GitHub上面找一下有没有哪位大神搞过了借鉴一下,然后果然发现一个好用的接口。

    想着既然找到了就先下载下来跑一下,嗯。。。“热门”的感觉可以,应该很简单。然后就兴高采烈地扩展一下别的商品种类,果然很多坑。。

    一、思路分析

    经过谷歌F12工具一番分析,总结一下爬取思路:

    1、“热门”商品比较特殊,其他商品种类有细分小分类,故需从大分类获取到小分类地址,然后进一步请求。以“女装”为例:地址为:http://apiv3.yangkeduo.com/operation/14/groups?page=1&size=100&opt_type=1 ,size为单页显示商品数量,最大可以400,大分类opt_type为1,小分类opt_type为2,14是“女装”ID。

    2、大分类和小分类页面有时第一次请求会失败,需多次请求才能成功,故需要设置一个循环。

    3、店铺信息在商品页列表里面每次请求会有所缺失,故需到商品页里面获取,但是商品页需要带请求参数,主要是cookieAccessToken(访问令牌)。这两个参数会过期,解决方法后面讨论。

    二、爬取字段

    店铺信息获取比较麻烦,如果不要的话会简单很多,商品评价如果要获取可以参考一下上面的GitHub地址,这里先注释掉。

        goods_id = scrapy.Field()  # 商品ID
        goods_name = scrapy.Field()  # 商品名字
        price = scrapy.Field()  # 拼团价格 返回的字段多乘了100
        sales = scrapy.Field()  # 已拼单数量
        normal_price = scrapy.Field()  # 单独购买价格
        # comments = scrapy.Field()  # 商品评价
        opt_id = scrapy.Field()  # 小分类ID
        opt_name = scrapy.Field()  # 小分类名字
        link_url = scrapy.Field()  # 商品地址
        mall_id = scrapy.Field()  # 店铺ID
        mall_name = scrapy.Field()  # 店铺名字
    

    三、spider代码

    这次爬虫采用的是scrapy_redis分布式爬取(顺便再熟悉一下),下面放上spider代码:

    # -*- coding: utf-8 -*-
    import scrapy
    import json
    from pinduoduo.items import PinduoduoItem
    from copy import deepcopy
    from scrapy_redis.spiders import RedisSpider
    import re
    
    
    class PdditemSpider(RedisSpider):
        name = 'pdditem'
        allowed_domains = ['yangkeduo.com']
        page = 1  # 起始页码数
        size = 400  # 单页显示数量(最大400)
        opt_type = 1
        offset = 0  # 偏移量100为一页
        # start_urls = ['http://apiv3.yangkeduo.com/operation/14/groups?page={}&size={}&opt_type={}'.format(page, size,opt_type)]  # 女装商品
        # 'http://apiv3.yangkeduo.com/operation/14/groups?page=1&size=400&opt_type=1'
        redis_key = "pinduoduo"
    
        def parse(self, response):  # 解析分类页
            goods_list_json = json.loads(response.body)
            url = response.url
            keys = goods_list_json.keys()
            key = list(keys)[2]
            if key == "error_code":  # 请求失败获取到错误json代码,重新请求
                print(key, "再次尝试请求")
                yield scrapy.Request(
                    url,
                    callback=self.parse,
                    dont_filter=True
                )
            else:
                item = PinduoduoItem()
                opt_infos = goods_list_json['opt_infos']
                if opt_infos is not None:
                    for info in opt_infos:
                        item['opt_id'] = info['id']
                        item['opt_name'] = info['opt_name']
                        yield scrapy.Request(
                            'http://apiv3.yangkeduo.com/operation/'+ str(item['opt_id'])+ '/groups?offset=0&size=100&opt_type=2',
                            callback=self.parse_good,
                            meta={"item": deepcopy(item)}
                        )
    
        def parse_good(self, response):  # 解析商品页
            item = response.meta["item"]
            goods_list_json = json.loads(response.body)
            url = response.url
            keys = goods_list_json.keys()
            key = list(keys)[-1]
            if key == "error_code":
                print(key,"再次尝试请求")
                yield scrapy.Request(
                    url,
                    callback=self.parse_good,
                    meta={"item": deepcopy(item)},  # 大坑!!重新请求需要带上item
                    dont_filter=True
                )
            else:
                goods_list = goods_list_json['goods_list']
                # 判断是否是最后一页
                if not goods_list:
                    return
                for each in goods_list:
                    item['goods_name'] = each['goods_name']
                    item['price'] = float(each['group']['price']) / 100  # 拼多多的价格默认多乘了100
                    item['sales'] = each['cnt']
                    item['normal_price'] = float(each['normal_price']) / 100
                    item['goods_id'] = each['goods_id']
                    item['link_url'] = 'http://yangkeduo.com/'+ each['link_url']
                    yield scrapy.Request(
                         item['link_url'],
                         callback=self.get_mall_data, meta={"item": item},)
    
                self.page += 1
                self.offset = self.page*100  # 构造下一页地址
                yield scrapy.Request(url='http://apiv3.yangkeduo.com/operation/'+ str(item['opt_id'])+ '/groups?offset={}&size=100&opt_type=2'.format(self.offset),
                                     callback=self.parse_good,
                                     meta={"item": item}
                                     )
    
        def get_mall_data(self, response):  # 获取店铺信息
            item = response.meta["item"]
            Cookie = response.request.headers.getlist('Cookie')
            mall_name = response.xpath("//div[@class='goods-mall-name']/text()").extract_first()
            if mall_name is not None:
                item['mall_name'] = mall_name
            data = response.body.decode('utf-8')
            pattern = re.compile(r'mall_id=(.*?)\"', re.S)
            result = re.search(pattern, data)
            if result is not None:
                item['mall_id'] = result.group(1)
            else:
                yield scrapy.Request(
                    response.url,
                    callback=self.get_mall_data,
                    meta={"item": item},
                    dont_filter=True
                )
            if item['mall_name'] and item['mall_id']:
                print(item)
                yield (item)
            else:
                print('数据获取不全,重新获取')
    
    
    
    

    四、最后

    不知道什么时候的数据
    在这里插入图片描述

    具体过程和参考代码请见:博客

    有任何问题请留言,谢谢。

    展开全文
  • 招聘信息爬取与分析

    2020-12-20 22:37:02
    招聘信息爬取与分析 写在前面 作为874万应届毕业生中的一员,近期也在积极地找工作,于是爬取了意向岗位以及相关岗位的信息,并对岗位分布、薪资情况、学历、公司规模与行业等进行了分析。 主要流程 数据爬取 招聘...
  • 58同城招聘信息爬取

    2018-05-03 09:22:10
    58同城的招聘信息爬取,包括发布公司信息,薪资,岗位学历要求,经验要求,职位详情等信息及部分信息的数据化
  • 淘宝商品信息爬取

    千次阅读 热门讨论 2020-12-20 12:39:33
    这两天做的python课设有一个关于python爬虫的题目,要求是从某宝爬取,那今天就来个某宝的商品信息爬取的内容吧! 首先确定个目标,根据某关键词搜索,从获取的页面信息中提取商品标题、价格、发货地点、付款人数、...

    这两天做的python课设有一个关于python爬虫的题目,要求是从某宝爬取,那今天就来个某宝的商品信息爬取的内容吧!

    • 首先确定个目标,根据某关键词搜索,从获取的页面信息中提取商品标题、价格、发货地点、付款人数、以及点名这些信息,这些信息都是直接在网页源代码中。
    • ok,目标定好了,就直接瞄准进攻吧!在淘宝中随便输入一个关键词,看一下url,顺便来个翻页,查看一下url的变化,为了方便查看不同页码的url的不同,就把他们放一起了,依次是1,2,3,4
    • https://s.taobao.com/search?q=%E7%BE%BD%E7%BB%92%E6%9C%8D&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201220&ie=utf8,
      https://s.taobao.com/search?q=%E7%BE%BD%E7%BB%92%E6%9C%8D&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201220&ie=utf8&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44,
      https://s.taobao.com/search?q=%E7%BE%BD%E7%BB%92%E6%9C%8D&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201220&ie=utf8&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88
    • 这么长,这么多,看不懂,怎么办,莫慌!那就把url解码工具来帮忙吧!http://tool.chinaz.com/tools/urlencode.aspx,然后把我们的url复制进去,然后你就会发现,oh,q=跟的是一个关键字的编码后的结果。那还有一串是啥啊?嗯,把三个url中重复的删掉!别问我怎么知道的,既然一样,那就是可有可无的了,可有可无的=没用的!删去的这一部分就不管他了,然后那两个带offset的,那个偏移量,一般给他删了也没啥问题,然后你就会发现,最后只剩下s了,第一页没有,默认0,第二页44,第三页88,那这个s就是跟翻页有关了,s = 44 * (页数 - 1)
    • OK,那我们就可以先构造url了,先把头头拿过来https://s.taobao.com/search?+q=编码后的字符+&s=(页码 - 1) x 44,url编码可以用urllib.parse.quote(‘字符’)就行了,先整个20页。
        key = '手套'
        key = parse.quote(key)
        url = 'https://s.taobao.com/search?q={}&s={}'
        page = 20
        for i in range(page):
            url_page = url.format(key, i * 44)
            print(url_page)
    

    然后当我们按照正常步骤构造headers请求头,用get()方法获取的时候,你会发现,呦吼,炸了,不行,返回的内容不对,唉,那该咋整啊,作业咋办啊,面向csdn编程不是随便说说的,然后我就知道了,用爬虫爬淘宝,需要“假登录”,获取头部headers信息,我们只弄个ua是肯定不行的,然后把弄好的headers作为参数传给qequests.get(url,headers = header)就行了,那该咋弄这个headers啊,右键,打开浏览器抓包工具,然后network,ctrl+r刷新一波,在all里面找到search?开头的,对他进行右键,copy as curl(bash),然后打开https://curl.trillworks.com/,然后粘贴,右边Python requests里直接复制headers,再请求就完事了!

    • 网页源码请求到了,该提取信息了,由于内容在script中,所以,re !
      然后我就贴心的把正则表达式贴过来了(小声比比,这是我拿老师写的改的)
        title = re.findall(r'\"raw_title\"\:\"(.*?)\"', response)
    
        nick = re.findall(r'\"nick\"\:\"(.*?)\"', response)
    
        item_loc = re.findall(r'\"item_loc\"\:\"(.*?)\"', response)
    
        price = re.findall(r'\"view_price\"\:\"(.*?)\"', response)
    
        sales = re.findall(r'\"view_sales\"\:\"(.*?)\"', response)
    

    正则表达式匹配得到的内容是一个列表,

    • title是标题
    • nick是店铺(这个多了一个哦,然后我看了看,最后一个没用,就切片把最后一个丢了就行)
    • item_loc是地区
    • price是价格
    • sales是付款人数
      咳咳,然后再来一波对应储存就行了,这边推荐您使用csv呢,亲!
      写在最后!!!, 大家不要直接copy代码,最起码curl转换的那个请求头得换了!不换的话没办法运行完全的!并且两次请求中间的间隔尽量长一点,我设置的3s, 同时如果在写入文件的时候有indexerror错误,可以尝试登录后复制curl来获取请求头!!!!大家一定不要直接复制哈!!!!!
      附上源码
    from urllib import parse
    from fake_useragent import UserAgent
    import requests
    import re
    import time
    import csv
    import os
    
    
    def get_response(url):
        ua = UserAgent()
    
        headers = {
            'authority': 's.taobao.com',
            'cache-control': 'max-age=0',
            'upgrade-insecure-requests': '1',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
            'sec-fetch-site': 'same-origin',
            'sec-fetch-mode': 'navigate',
            'sec-fetch-user': '?1',
            'sec-fetch-dest': 'document',
            'accept-language': 'zh-CN,zh;q=0.9',
            'cookie': 'cna=jKMMGOupxlMCAWpbGwO3zyh4; tracknick=tb311115932; _cc_=URm48syIZQ%3D%3D; thw=cn; hng=CN%7Czh-CN%7CCNY%7C156; miid=935759921262504718; t=bd88fe30e6685a4312aa896a54838a7e; sgcookie=E100kQv1bRHxrwnulL8HT5z2wacaf40qkSLYMR8tOCmVIjE%2FxrR5nzhju3UySug2dFrigMAy3v%2FjkNElYj%2BDcqmgdA%3D%3D; uc3=nk2=F5RGNwnC%2FkUVLHU%3D&vt3=F8dCuf2OXoGHiuEl2D8%3D&id2=VyyUy7sStBYaoA%3D%3D&lg2=U%2BGCWk%2F75gdr5Q%3D%3D; lgc=tb311115932; uc4=nk4=0%40FY4NAq0PgYBeuIHFyHE%2F9QSZnG6juw%3D%3D&id4=0%40VXtbYhfspVba1o0MN1OuNaxcY%2BUP; enc=tJQ9f26IYMQmwsNzfEZi6fJNcflLvL6bdcU4yyus3rqfsM37Mpy1jvcSMZ%2BYSaE5vziMtC9svi%2B4JVMfCnIsWA%3D%3D; _samesite_flag_=true; cookie2=112f2a76112f88f183403c6a3c4b721f; _tb_token_=eeeb18eb59e1; tk_trace=oTRxOWSBNwn9dPyorMJE%2FoPdY8zfvmw%2Fq5v3iwJfzrr80CDMiLUbZX4jcwHeizGatsFqHolN1SmeHD692%2BvAq7YJ%2FbITqs68WMjdAhcxP7WLdArSe8thnE40E0eWE4GQTvQP9j5XSLFbjZAE7XgwagUcgW%2Fg6rXAuZaws1NrrZksnq%2BsYQUb%2FHT%2Fa1m%2Fctub0jBbjlmp8ZDJGSpGyPMgg561G3vjIRPVnkhRCyG9GgwteJUZAsyQIkeh7xtdyN%2BF50TIambWylXMZhQW7LQGZ48rHl3Q; lLtC1_=1; v=0; mt=ci=-1_0; _m_h5_tk=b0940eb947e1d7b861c7715aa847bfc7_1608386181566; _m_h5_tk_enc=6a732872976b4415231b3a5270e90d9c; xlly_s=1; alitrackid=www.taobao.com; lastalitrackid=www.taobao.com; JSESSIONID=136875559FEC7BCA3591450E7EE11104; uc1=cookie14=Uoe0ZebpXxPftA%3D%3D; tfstk=cgSFBiAIAkEUdZx7kHtrPz1rd-xdZBAkGcJ2-atXaR-zGpLhi7lJIRGJQLRYjef..; l=eBI8YSBIOXAWZRYCBOfaourza779sIRYSuPzaNbMiOCP9_fp5rvCWZJUVfT9CnGVh6SBR3-wPvUJBeYBqnY4n5U62j-la_Dmn; isg=BAsLX3b80AwyYAwAj8PO7RC0mq_1oB8iDqsYtX0I5sqhnCv-BXFHcGI-cpxyuXca',
        }
        response = requests.get(url, headers=headers).content.decode('utf-8')
        # "raw_title":"卡蒙手套女2020秋冬季新款运动保暖护手休闲针织触屏防寒羊皮手套"
        # "view_price":"208.00"
        # "nick":"intersport旗舰店"
        # "item_loc":"江苏 连云港"
        # "view_sales":"0人付款"
        title = re.findall(r'\"raw_title\"\:\"(.*?)\"', response)
    
        nick = re.findall(r'\"nick\"\:\"(.*?)\"', response)[:-1]
    
        item_loc = re.findall(r'\"item_loc\"\:\"(.*?)\"', response)
    
        price = re.findall(r'\"view_price\"\:\"(.*?)\"', response)
    
        sales = re.findall(r'\"view_sales\"\:\"(.*?)\"', response)
        return [title, nick, item_loc, price, sales]
    
    
    def tocsv(file, filename):
        with open(filename, 'a+', encoding='utf-8') as f:
            f.seek(0)
            write = csv.writer(f)
            if f.read() == '':
                write.writerow(('标题', '店铺', '地点', '价格', '付款人数'))
    
            for i in range(len(file[0])):
                write.writerow((file[0][i], file[1][i], file[2][i], file[3][i], file[4][i]))
    
    
    if __name__ == '__main__':
        filename = 'taobao.csv'
        key = '手套'
        key = parse.quote(key)
        url = 'https://s.taobao.com/search?q={}&s={}'
        page = 20
        if os.path.exists('taobao.csv'):
            os.remove('taobao.csv')
        for i in range(page):
            url_page = url.format(key, i * 44)
            print(url_page)
            res = get_response(url_page)
            time.sleep(1)
            tocsv(res, filename=filename)
    
    

    可是因为爬取次数太多,淘宝不给我爬了,然后我就想用selenium试试吧,结果登录过了,还是不能过验证码那一关
    在这里插入图片描述
    然后,他就这样了!
    在这里插入图片描述
    这样的话就只能尝试购买代理IP或者用技术破解滑块了,代理好贵,滑块好难
    在这里插入图片描述
    亲测用免费的代理池不得行,哭辽
    咳,最近进展,我发现过了两天他又能用了,应该只是暂时的限制,问题不大,当出现验证码拦截的时候等几天就行了

    展开全文
  • 亚马逊商品信息爬取

    千次阅读 2019-03-18 11:25:22
    亚马逊商品信息爬取 国内的电商网站,淘宝、京东、拼多多都爬取过了,今天来爬取一个对跨境电商很重要的亚马逊电商平台。 一、爬取分析 亚马逊全部商品接口为:...

    亚马逊商品信息爬取

    国内的电商网站,淘宝、京东、拼多多都爬取过了,今天来爬取一个对跨境电商很重要的亚马逊电商平台。

    一、爬取分析

    亚马逊全部商品接口为:https://www.amazon.cn/gp/site-directory/ref=nav_deepshopall_variant_fullstore_l1 ,通过该接口可以获取到需要的分类商品信息。

    和之前一样,分为大分类、中分类、小分类,一步步深入,直到小分类的具体商品信息。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sVTo0bZB-1572573091131)(/media/editor/01_20190318101741444994.png)]

    二、爬取内容

    本次爬虫采用的是scrapy框架,item里爬取的信息有:

    import scrapy
    
    
    class AmazonItem(scrapy.Item):
        # define the fields for your item here like:
        collection = 'amazon'  # 数据表
    
        b_cate = scrapy.Field()  # 大分类
        m_cate = scrapy.Field()  # 中分类
        s_cate = scrapy.Field()  # 小分类
        s_href = scrapy.Field()  # 小分类url
        name = scrapy.Field()  # 商品名称
        goods_url = scrapy.Field()  # 商品url
        brand = scrapy.Field()  # 商品品牌
        price = scrapy.Field()  # 商品价格
        freight = scrapy.Field()  # 运费
        grade = scrapy.Field()  # 评分(满分5分)
        comment_count = scrapy.Field()  # 评论人数
    

    当然还可以提取其他一些信息,深入获取评论信息,有需要的话后续会提供。

    三、主代码spider

    使用scrapy爬取,spider里面编写主要的爬取方法。

    需要注意的是:由于多层分类,在获取详情页url之前要使用深拷贝,避免爬取错乱。

    meta={“item”: deepcopy(item) ,meta传递item所有的参数。

    # -*- coding: utf-8 -*-
    import scrapy
    from amazon.items import AmazonItem
    from copy import deepcopy
    
    
    class YmxSpider(scrapy.Spider):
        name = 'ymx'
        allowed_domains = ['amazon.cn']
        start_urls = ['https://www.amazon.cn/gp/site-directory/ref=nav_deepshopall_variant_fullstore_l1']
    
        def parse(self, response):
            # print(response.text)
            item = AmazonItem()
            div_list = response.xpath("//div[contains(@class,'a-spacing-top-medium')][7]")  # 选取第5个的分类来爬,全部爬取去掉[5]
            # 大分类分组
            for div in div_list:
                item['b_cate'] = div.xpath(".//span[contains(@class,'sd-fontSizeL1')]/a/text()").extract()
                # print(item['b_cate'])
                m_list = div.xpath(".//div[contains(@class,'sd-columnSize')]")
                # 中间分类分组
                for m in m_list:
                    item['m_cate'] = m.xpath(".//span[@class='sd-fontSizeL2 a-text-bold']/a/text()").extract_first()
                    # print(item['m_cate'])
                    ul_list = m.xpath(".//div[@class='a-row']/ul//span[@class='sd-fontSizeL2']")
                    # 小分类分组
                    for ul in ul_list:
                        item['s_cate'] = ul.xpath("./a/text()").extract_first()
                        item['s_href'] = ul.xpath("./a/@href").extract_first()
                        item['s_href'] = 'https://www.amazon.cn' + item['s_href']
                        # print(item['s_cate'])
                        if item['s_href'] is not None:
                            yield scrapy.Request(
                                item['s_href'],
                                callback=self.parse_detial,
                                meta={"item": deepcopy(item)}
                            )
    
        def parse_detial(self, response):
            item = response.meta["item"]
            li_list = response.xpath("//div[@id='mainResults' or 'atfResults']/ul/li")
            for li in li_list:
                item["name"] = li.xpath(".//a[contains(@class,'s-access-detail-page')]/@title").extract_first()
                item["goods_url"] = li.xpath(".//a[contains(@class,'s-access-detail-page')]/@href").extract_first()
                item["brand"] = li.xpath(".//span[contains(@class,'a-size-small')][2]/text()").extract_first()
                item["price"] = li.xpath(".//span[contains(@class,'s-price')]/text()").extract_first()
                freight = li.xpath(".//div[contains(@class,'a-spacing-mini')][2]/div/span[2]/text()").extract_first()
                if freight is not None:
                    item["freight"] = freight
                else:
                    item["freight"] = '免运费'
                grade = li.xpath(".//span[contains(@class,'a-declarative')]//span/text()").extract_first()
                if grade is not None:
                    item["grade"] = grade
                else:
                    item["grade"] = '暂无评分'
                comment_count = li.xpath(".//span[contains(@class,'a-declarative')]/../../a[contains(@class,'a-size-small')]/text()").extract_first()
                if comment_count is not None:
                    item["comment_count"] = comment_count
                else:
                    item["comment_count"] = '暂无评论'
                # print(item)
                yield item
    
            #下一页
            next_url = response.xpath("//a[@id='pagnNextLink']/@href").extract_first()
            if next_url is not None:
                next_url = 'https://www.amazon.cn' + next_url
                yield scrapy.Request(
                    next_url,
                    callback=self.parse_detial,
                    meta={"item": item}
                )
    
    
    

    四、运行与保存

    在pipelines里处理spider返回的item字段的保存方法,这里使用MongoDB保存数据。

    import pymongo
    
    
    class MongoPipeline(object):
        def __init__(self, mongo_uri, mongo_db):
            self.mongo_uri = mongo_uri
            self.mongo_db = mongo_db
    
        @classmethod
        def from_crawler(cls, crawler):
            return cls(
                mongo_uri=crawler.settings.get('MONGO_URI'),
                mongo_db=crawler.settings.get('MONGO_DB')
            )
    
        def open_spider(self, spider):
            self.client = pymongo.MongoClient(self.mongo_uri)
            self.db = self.client[self.mongo_db]
    
        def process_item(self, item, spider):
            name = item.collection
            # self.db[name].insert(dict(item))
            self.db[name].update({'goods_url': item['goods_url']}, dict(item), True)  # 以详情页地址过滤更新
            return item
    
        def close_spider(self, spider):
            self.client.close()
    

    运行start.py文件,就会看到爬虫已经开始运行,爬取内容会保存到MongoDB中。

    爬取到MongoDB数据字段如下,这里并没有全部跑完。

    在这里插入图片描述

    五、总结

    具体参考代码放到GitHub上面,可以访问博客末尾查看。

    有任何问题请留言,谢谢!

    交流互动学习群,网罗分享学习资料。欢迎加入:861862805(如有打扰,请忽略。。)
    在这里插入图片描述

    展开全文
  • python 爬虫 51job岗位信息爬取

    万次阅读 2020-11-08 21:45:15
    新人自学python 和爬虫,还请各位大佬们指点指点 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/11/8 15:14 # @Author : Huni # @File : 51(正则).py ...#爬取糗事百科的所有热图 def main():
  • 京东商品信息爬取

    千次阅读 2020-03-23 16:22:41
    京东商品信息爬取方法与思路:应用模块:数据提取方式:pyquery解析库网页分析:代码如下:运行效果: 仅供学习参考,错误之处还请留言交流。 方法与思路: 应用模块: from selenium import webdriver #导入驱动...
  • 微信公众号信息爬取

    2019-03-11 12:41:22
    微信公众号信息爬取 微信公众号文章信息爬取利用的是搜狗的微信文章搜索,通过搜索页面的结合找对应关键词的文章 https://weixin.sogou.com/ 代码的大致介绍 考虑到访问频繁容易封ip 这里采用了阿布云的IP,有...
  • 全网页信息爬取方法

    2020-06-23 17:16:00
    火车头网页信息爬取 全网页信息爬取方法 拒绝代码,火车头采集器的多种玩法 一级网址 | 二级网址 分页 | 详情页 一级网址| 二级网址| 三级网址|......|终极网址 分类1连接|分类2连接|分类3连接|......|详情页 ...
  • 网易云音乐信息爬取和喜马拉雅音乐爬取
  • B站视频信息爬取

    千次阅读 2019-03-19 16:25:57
    B站视频信息爬取爬虫思路数据爬取导入库构造请求头设定代理IP数据获取将获取内容写入excell文档爬取数据部分展示 B站数据可视化视频逐渐流行,想做一期B站视频类型的数据分析,故开始爬取视频信息,来挖掘内容。 ...
  • 目录一、API接口寻找二、爬取分析三、更多信息爬取 一、API接口寻找 二、爬取分析 三、更多信息爬取
  • 淘女郎个人信息爬取

    千次阅读 2018-06-27 21:22:57
    淘女郎个人信息爬取 淘宝的模特小姐姐们贼好看,就想爬一波小姐姐们的个人信息喽,大致就是这个图片啦 1.寻找接口 通过网络请求分析发现是json传递的信息 接口就是...
  • 下面小编就为大家分享一篇使用python爬虫实现网络股票信息爬取的demo,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • App的信息爬取1

    2018-06-13 16:52:31
    掌握移动端App的信息爬取 掌握API接口信息的爬取 学会Charles抓包工具使用 学会mitmproxy抓包工具使用 学会极验滑动验证码的识别 掌握爬虫项目的分析和设计 学会完整爬虫项目的实战
  • 安居客二手房信息爬取

    千次阅读 2018-05-21 20:10:57
    安居客二手房信息爬取 本文实现爬取安居客二手房房源信息,并保存到本地csv文本中 爬取网址:https://tianjin.anjuke.com/sale/hexi/(天津河西区二手房房源) 思路 1.构造请求地址:通过分析网站,可发现页面...
  • Python-Boss直聘Python招聘岗位信息爬取和分析
  • 基于Python的汽车信息爬取与分析二、基于Python的汽车数据爬取与分析1 课题内容和要求1.1 问题的提出1) 用 Python 语言自行编写爬虫框架或使用 Scrapy 框架,爬取汽车之家或易车网的车辆相关 数据,按照品牌、车系、...
  • python3.x实现智联招聘网站岗位信息爬取,如果需要换工作的话,这个一定用的上
  • python爬取机票信息爬取携程网的机票信息
  • 百度盘信息爬取.py

    2020-04-12 11:31:03
    爬虫,用来爬取百度盘信息爬虫,
  • java写的爬取企查查信息代码,仅供学习交流使用 java写的爬取企查查信息代码,仅供学习交流使用
  • 微博个人主页的信息爬取 闲话少说,先进入分析过程。 因为相对而言移动端的界面会比较好爬取,所以今天我们爬取移动端微博的页面,如下: 这里是前后端分离异步加载的数据,所以我们去抓包工具下寻找对应的接口地址...
  • 使用Python2.7的版本,爬取智联招聘岗位信息,并将招聘结果保存在excel中。
  • CBA球员信息爬取

    2019-01-04 00:23:45
    导入库: 获取网页代码: 分析浏览器中数据与代码的呈现方法: 我们所需要爬取信息都在这里了 下面开始收取我们所爬取信息: 这样就完成了CBA球员信息爬取。...
  • 豆瓣影评信息爬取

    千次阅读 2018-04-08 22:18:58
    爬取豆瓣影评信息
  • BOSS直聘网站数据分析岗位信息爬取

    千次阅读 2018-10-02 12:01:32
    Boss直聘网站已改用ajax了,可以改用selenium库爬取,下面爬虫已过时,但数据分析方法还是可以用的...一、信息爬取 二、数据分析 2.1 数据解析 2.2 数据分析 2.2.1 数据清洗 2.2.2 查看单个特征分布 2.2...
  • 安居客新房信息爬取

    千次阅读 2019-06-08 16:11:37
    本文实现爬取安居客二手房房源信息,并保存到本地csv文本中 爬取网址:https://tj.fang.anjuke.com/loupan/all/(天津新房) #使用模块:BeautifulSoup import requests import math import time import random from...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,036
精华内容 10,814
关键字:

信息爬取