网页手机号抓取程序(Python实现如何发送一个HTTP请求(模拟浏览器)(组图) )

优采云 发布时间: 2021-10-28 03:12

  网页手机号抓取程序(Python实现如何发送一个HTTP请求(模拟浏览器)(组图)

)

  使用Fiddler抓包分析公众号

  打开微信,随机选择一个公众号,查看公众号的所有历史文章列表

  

  

  在Fiddler上已经可以看到请求进来了,说明公众号文章使用的是HTTPS协议。这些请求是微信客户端向微信服务器发送的HTTP请求。

  模拟微信请求

  

  1、服务器的响应结果,200表示服务器响应请求成功

  2、请求协议,微信请求协议是基于HTTPS的,所以Fiddle一定要配置好,否则看不到HTTPS请求。

  3、 请求路径,包括请求方法(GET)、请求协议(HTTP/1.1)、请求路径(/mp/profile_ext...)参数串)

  4、 收录cookie信息的请求头。

  5、微信服务器返回的响应数据。

  

  

  确定微信公众号的请求HOST后,我们可以使用过滤器过滤掉不相关的请求。

  

  爬虫的基本原理是模拟浏览器发送HTTP请求,然后从服务器获取响应结果。现在我们使用 Python 来实现如何发送 HTTP 请求。这里我们使用 requests 库来发送请求。

  复制 URL 和请求标头

  我们直接从 Fiddler 请求中复制 URL 和 Headers,右键单击 -> Copy -> Just Url/Headers Only

  

  url = 'https://mp.weixin.qq.com/mp/profile_ext' \

'?action=home' \

'&__biz=MzA5MTAxMjEyMQ==' \

'&scene=126' \

'&bizpsid=0' \

'&devicetype=android-23' \

'&version=2607033c' \

'&lang=zh_CN' \

'&nettype=WIFI' \

'&a8scene=3' \

'&pass_ticket=LvcLsR1hhcMXdxkZjCN49DcQiOsCdoeZdyaQP3m5rwXkXVN7Os2r9sekOOQULUpL' \

'&wx_header=1'

  

  因为 requests.get 方法中的 headers 参数必须是字典对象,所以我们必须先写一个函数将刚刚复制的字符串转换成字典对象。

  def headers_to_dict(headers):

"""

将字符串

'''

Host: mp.weixin.qq.com

Connection: keep-alive

Cache-Control: max-age=

'''

转换成字典对象

{

"Host": "mp.weixin.qq.com",

"Connection": "keep-alive",

"Cache-Control":"max-age="

}

:param headers: str

:return: dict

"""

headers = headers.split("\n")

d_headers = dict()

for h in headers:

if h:

k, v = h.split(":", 1)

d_headers[k] = v.strip()

return d_headers

  公众号历史文章数据在response.text中。如果返回的内容很短,标题标签是验证,

  那么就说明你的请求参数或者请求头有误。最可能的请求类型是标头中的 Cookie 字段已过期。

  重新向手机微信发起请求,获取最新的请求参数和请求头。

   response = requests.get(url, headers=headers_to_dict(headers), verify=False)

print(response.text)

if '验证' in response.text:

raise Exception("获取微信公众号文章失败,可能是因为你的请求参数有误,请重新获取")

# with open("weixin_history.html", "w", encoding="utf-8") as f:

# f.write(response.text)

  

  History文章 被封装在一个名为 msgList 的数组中(实际上该数组被包裹在一个字典结构中)。这是一个Json格式的数据,但是有html转义字符需要处理。

  

  写一个提取历史文章数据的方法,分三步,先用正则规则提取数据内容,然后html转义处理,最后得到一个list对象,返回最近发表的10篇文章< @文章

  def extract_data(html_content):

"""

从html页面中提取历史文章数据

:param html_content 页面源代码

:return: 历史文章列表

"""

import re

import html

import json

rex = "msgList = '({.*?})'" # 正则表达

pattern = re.compile(pattern=rex, flags=re.S)

match = pattern.search(html_content)

if match:

data = match.group(1)

data = html.unescape(data) # 处理转义

# print('data: {}'.format(data))

data = json.loads(data)

articles = data.get("list")

for item in articles:

print(item)

return articles

  最后提取出来的数据有10条,是最近发布的10条数据。让我们看看每条数据返回哪些字段。

  

  发送时间对应comm_msg_info.datetime。 app_msg_ext_info中的字段信息为第一篇文章文章的字段信息,对应:

  以下文章文章以列表的形式存储在multi_app_msg_item_list字段中。

  

  详细代码

  import requests

url = 'https://mp.weixin.qq.com/mp/profile_ext' \

'?action=home' \

'&__biz=MzA5MTAxMjEyMQ==' \

'&scene=126' \

'&bizpsid=0' \

'&devicetype=android-23' \

'&version=2607033c' \

'&lang=zh_CN' \

'&nettype=WIFI' \

'&a8scene=3' \

'&pass_ticket=LvcLsR1hhcMXdxkZjCN49DcQiOsCdoeZdyaQP3m5rwXkXVN7Os2r9sekOOQULUpL' \

'&wx_header=1'

headers ='''

Host: mp.weixin.qq.com

Connection: keep-alive

User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; OPPO R9s Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044405 Mobile Safari/537.36 MMWEBID/5576 MicroMessenger/6.7.3.1360(0x2607033C) NetType/WIFI Language/zh_CN Process/toolsmp

x-wechat-key: d2bc6fe213fd0db717e11807caca969ba1d7537e57fc89f64500a774dba05a4f1a83ae58a3d039efc6403b3fa70ebafb52cfd737b350b58d0dca366b5daf92027aaefcb094932df5a18c8764e98703dc

x-wechat-uin: MTA1MzA1Nzk4Mw%3D%3D

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,image/wxpic,image/sharpp,image/apng,image/tpg,/;q=0.8

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,en-US;q=0.8

Q-UA2: QV=3&PL=ADR&PR=WX&PP=com.tencent.mm&PPVN=6.7.3&TBSVC=43620&CO=BK&COVC=044405&PB=GE&VE=GA&DE=PHONE&CHID=0&LCID=9422&MO= OPPOR9s &RL=1080*1920&OS=6.0.1&API=23

Q-GUID: edb298c301f35e6c59298f2313b788cb

Q-Auth: 31045b957cf33acf31e40be2f3e71c5217597676a9729f1b

'''

def headers_to_dict(headers):

"""

将字符串

'''

Host: mp.weixin.qq.com

Connection: keep-alive

Cache-Control: max-age=

'''

转换成字典对象

{

"Host": "mp.weixin.qq.com",

"Connection": "keep-alive",

"Cache-Control":"max-age="

}

:param headers: str

:return: dict

"""

headers = headers.split("\n")

d_headers = dict()

for h in headers:

if h:

k, v = h.split(":", 1)

d_headers[k] = v.strip()

return d_headers

# with open("weixin_history.html", "w", encoding="utf-8") as f:

# f.write(response.text)

def extract_data(html_content):

"""

从html页面中提取历史文章数据

:param html_content 页面源代码

:return: 历史文章列表

"""

import re

import html

import json

rex = "msgList = '({.*?})'" # 正则表达

pattern = re.compile(pattern=rex, flags=re.S)

match = pattern.search(html_content)

if match:

data = match.group(1)

data = html.unescape(data) # 处理转义

# print('data: {}'.format(data))

data = json.loads(data)

articles = data.get("list")

return articles

def crawl():

"""

爬取文章

:return:

"""

response = requests.get(url, headers=headers_to_dict(headers), verify=False)

print(response.text)

if '验证' in response.text:

raise Exception("获取微信公众号文章失败,可能是因为你的请求参数有误,请重新获取")

data = extract_data(response.text)

for item in data:

print(item['app_msg_ext_info'])

if __name__ == '__main__':

crawl()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线