互动吧爬虫实战+python

最近由于工作需要爬取一些数据,分享几篇文章爬虫实战的文章。

网址:http://www.hdb.com/hangzhou/

对于爬虫首先你要了解一些基础知识,Http 请求等。使用chrome浏览器,安装一个插件,可以使用浏览器的抓包工具,我这里使用的是Safari浏览器,大致一样。在浏览器右击有一个检查元素,我的是Inspect Element。

我是用的是python,使用的requests库做请求,页面解析用lxml库,页面信息提取用xpath(这里浏览器我安装了一个xpath插件,作为一个xpath取值的验证工具)

提示:接下来几篇文章是用不同的页面解析工具和取值方法,包括Beautifulsoup、常用的正则取值等,希望可以继续看。

我需要爬取的是我在搜索框内输入关键词,然后返回的页面中活动商家的名称和手机号(注意只匹配手机号)

然后到二级页面取所需要的值,一个活动的店名,一个是手机号

首先你要从一级页面获取到每一个二级页面的对应链接,才可以进入二级页面取到对应的值

可以找到每个活动的信息都在ul这个标签下,一个li标签下面包含一个活动,点开后发现<a>标签里包着二级页面的链接,在href属性。所以你的目标是取到每一个<li>下的<a>标签的href属性的文本。

代码:

# 发送请求的库
import requests
# 将中文改成网址的url的库
from urllib.parse import quote
# 取随机数的库
import random
# 正则匹配的库
import re
# 解析页面的库
from lxml import etree


# 请求头中的User_agent,模仿浏览器发送请求必备
user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
]

# 请求头,这里我只用了一个User_Agent,你可以添加其他
headers = {'User-Agent': random.choice(user_agent)}

# 用循环去搜索多个关键词
dict_objs = ['绘画','主持人','跆拳道']
for dict_obj in dict_objs:
    # 将汉字转化成url路径
    encode_after = quote(dict_obj)
    # 用循环爬取多页
    for i in range(1, 80):
        # 请求所传的参数,查看页面使用的get请求,这些参数都会拼接在基础url后
        data = {
            'word':encode_after,
            'area_code': 'quanguo',
            'page_num': str(i),
        }
        # 基础url
        url = "http://www.hdb.com/info_search?"
        # 发送get请求
        response = requests.get(url=url, headers=headers, params=data)
        # 打印请求的实际url
        print(response.url)
        # 将返回的请求对象转化成content流文本
        response = response.content
        # 用lxml库下的etree将流文本转化成HTML文档树
        html_tree = etree.HTML(response)
        # 用xpath取到所有li的链接
        ret = html_tree.xpath('/html/body/div[2]/div/ul/li/div/h3/a/@href')
        for i in ret:
            # 向二级页面发送请求
            response1 = requests.get(url=i, headers=headers)

上述代码每一段都注释的很清楚了。下面分析二级页面,我们要用xpath拿到商家名称很容易,重要的是拿取详情页面的手机号。分析到手机号都是在详情页面的div里,所以先用xpath取到详情页面的所有内容,再用re正则匹配手机号。如下图:

<div id="dt_content" >这个标签下是详情页面的div,然后用正则匹配手机号。

代码如下:

try:
    # 用re匹配到<div id="dt_content">标签里所有的内容
    tel_page = re.findall(r'<div id="dt_content" class="dt_content" ms-skip >(.*?)</div>',response1.text, re.S)
    tel_str = tel_page[0]

    # 在用re匹配到详情页面的手机号
    tel = re.findall(r'13[0-9]\d{8}|14[5,7]\d{8}|^:15[0-3,5-9]\d{8}|17[0,3,5-8]\d{8}|18[0-9]\d{8}|166\d{8}|198\d{8}|199\d{8}|147\d{8}',tel_str)

    html_tree1 = etree.HTML(response1.content)
    # 用xpath拿到商家名称
    biaoti = html_tree1.xpath('//*[@id="dt_title"]/text()')

    # 用xpath拿到发布者所在的链接,这是新加的上面没讲
    fabuzhe=html_tree1.xpath('//*[@id="subinfo_name"]/@href')
    # print(fabuzhe)
    print(tel)
    print(biaoti[1].strip())
    pub=re.search(r'/timeline/(.*?).html', fabuzhe[0])
    publishUserId36=pub.group(1)
    print(publishUserId36)
    
    # 将发布者链接发送post请求,拿到json数据
    url1 = 'http://api.hdb.com/ajax/api:4009?'
    data = {
        'queryType': 2,
        'publishUserId36': publishUserId36,
    }
    
    response2=requests.post(url=url1,data=data,headers=headers)
    fabuzhe_xiangxi = response2.json()
    # 解析json数据,拿到发布者信息
    fabuzhe_xiangxi1 = fabuzhe_xiangxi['result']['shopName']

最后来一个整体代码:

import requests
from urllib.parse import quote
import random
import re
from lxml import etree



user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
]


headers = {'User-Agent': random.choice(user_agent)}

dict_objs = ['绘画','主持人']
for dict_obj in dict_objs:
    encode_after = quote(dict_obj)
    for i in range(1, 80):

        data={
            'word':encode_after,
            'area_code': 'quanguo',
            'page_num': str(i),
        }


        url = "http://www.hdb.com/info_search?"
        response = requests.get(url=url, headers=headers, params=data)
        print(response.url)
        response = response.content
        html_tree = etree.HTML(response)
        ret = html_tree.xpath('/html/body/div[2]/div/ul/li/div/h3/a/@href')
        for i in ret:
            response1 = requests.get(url=i, headers=headers)

            try:
                tel_page = re.findall(r'<div id="dt_content" class="dt_content" ms-skip >(.*?)</div>',response1.text, re.S)
                tel_str = tel_page[0]
                tel = re.findall(r'13[0-9]\d{8}|14[5,7]\d{8}|^:15[0-3,5-9]\d{8}|17[0,3,5-8]\d{8}|18[0-9]\d{8}|166\d{8}|198\d{8}|199\d{8}|147\d{8}',tel_str)
                html_tree1 = etree.HTML(response1.content)
                biaoti = html_tree1.xpath('//*[@id="dt_title"]/text()')
                fabuzhe=html_tree1.xpath('//*[@id="subinfo_name"]/@href')
                # print(fabuzhe)
                print(tel)
                print(biaoti[1].strip())
                pub=re.search(r'/timeline/(.*?).html', fabuzhe[0])
                publishUserId36=pub.group(1)
                print(publishUserId36)

                url1 = 'http://api.hdb.com/ajax/api:4009?'
                data = {
                    'queryType': 2,
                    'publishUserId36': publishUserId36,
                }

                response2=requests.post(url=url1,data=data,headers=headers)



                fabuzhe_xiangxi = response2.json()
                fabuzhe_xiangxi1 = fabuzhe_xiangxi['result']['shopName']

喜欢就点个赞吧?

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
 砍价宝砍价商城小程序轻松搭建您的微信砍价小程序,强力度营销插件配合活动迅速吸粉变现。   ·多活动支持,每个活动单独设置砍价规则·支持货到付款及在线支付双重支付方式·抢购+砍价有效留存用户·每个用户可设置帮砍次数,有效屏蔽刷量 模块介绍: 砍价宝砍价商城小程序轻松搭建您的微信砍价小程序,强力度营销插件配合活动迅速吸粉变现。·多活动支持,每个活动单独设置砍价规则 ·支持货到付款及在线支付双重支付方式 ·抢购+砍价有效留存用户 ·每个用户可设置帮砍次数,有效屏蔽刷量 功能特色: 砍价+抢购双重营销多种订单模式适配活动设置多样性 支持多活动,单个活动可单独设置砍价规则,好友帮砍次数。 同时支持运费及商品类型设置。 适用不同行业 活动分商品类和服务类。可适配不同的行业需求,商品类活动用户提交订单后后台设置物流单号发货。服务类活动用户提交订单后自动生成二维码,凭二维码到线下门店核销。 砍价+抢购双重营销 同时支持砍价+抢购双重营销,后台活动管理中可随时开启。 适用于不同的用户需求。多商户多店员灵活管理 多商户灵活管理。不同活动及店员关联不同商户,后续还将开启商户端管理功能。 活动地域限制 适用于制作地区业务的用户。活动管理可开启地域限制,输入城市名称即可限制可参与活动的地区。 多种模板消息支持 后台自动生成模板消息,支持发起砍价、砍价成功、订单提交成功、活动开始提醒等多种消息提示。 可无限生成小程序 一次购买砍价宝,可无限次生成小程序,不同小程序活动、订单等其他数据均独立,互不影响。 版本更新: 版本号:7.2.0 - 砍价_抢购_拼团 [优化]优化了开启抢购分享赚后海报生成时因文件名重叠而导致扫码后活动相同的问题。 [优化]修复了后台广告设置无法保存的问题。 [优化]修复了首页拼团列表拼团参与数为0的问题。 本次更新后请及时提交小程序端审核。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子园

期待你的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值