本片博客主要再介绍两个爬虫项目:
-
1.爬去天气(发送人的邮箱开通stmp才可以发邮件)
-
python爬取你喜欢的公众号的所有原创文章
项目实战参考一:python爬取你喜欢的公众号的所有原创文章
准备工作:我们需要提前安装好一个抓包工具(客户端或是app抓取电脑发送的请求和接受响应的)
Fiddler抓包工具的基本介绍,安装和下载可以参考这个链接:
https://www.cnblogs.com/cherrycui/p/10580031.html
手机端抓包的设置可以参考这个链接:
https://www.cnblogs.com/wushuaishuai/p/9300262.html
我以爬取公众号谢公子学安全为例:
当我点进某个文章的时候
使用fiddler获取到
url:
https://mp.weixin.qq.com/mp/getappmsgext?f=json&mock=&uin=NzU3OTg2NzE2&key=82eb7d7c3126bb970554f401df19ecc5ec0c14f099566f7cba79dfbd4b7b6cf462d8e38ab7416a8a4da25f14bb22e44e3ff5dcab5158327522e7d6e01e8b273d6180fc2b67d903a8f5c148095330edc9&pass_ticket=X2%25252F7Ryy5s8UFGeFzV9eMwYQaHCZEERLkEjGliS9N6Zxwewl2rZZOZ93uiVR6m5F%25252B&wxtoken=777&devicetype=Windows%26nbsp%3B10&clientversion=62060841&__biz=MzI2NDQyNzg1OA%3D%3D&appmsg_token=1044_5KADmv4BD7%252B0eP9a9pdxxZUP3lD3XN0odJoSrmkKpfKkaBnz2s1sQUU5Ah_3k4QWX25nhZTRsoYofQWy&x5=0&f=json
cookie:
rewardsn=;
wxtokenkey=777;
wxuin=757986716;
devicetype=Windows10;
version=62060841;
lang=zh_CN;
pass_ticket=X2/7Ryy5s8UFGeFzV9eMwYQaHCZEERLkEjGliS9N6Zxwewl2rZZOZ93uiVR6m5F+; wap_sid2=CJzrt+kCElx2Z0F6aWZiWmhZLTFQVEh0MmduOHF4RVd5ZXJ3dldCaGw5OWJYbkpDV2dKN0FtYVZiU0I3RDFkVmlnQU13dkJERUpSNi04RVJBQ1ZIQWpqUXJyYzJuUlFFQUFBfjDGqoDxBTgNQAE=
请求参数:
大概步骤:
设置参数,cookie,url 和基本的请求参数
# 这些信息不能抄我的,要用你自己的才有效
headers = {
'Connection': 'keep - alive',
'Accept': '* / *',
'User-Agent': '写你自己的', #用户的浏览器
'Referer': '写你自己的', #上次请求的链接
'Accept-Encoding': 'br, gzip, deflate'
}
#使用的时候可以把整段贴上去,但最少仅需要wap_sid2这部分
cookies = {
'devicetype': 'iOS12.2',
'lang': 'zh_CN',
'pass_ticket': '写你自己的',
'version': '1700042b',
'wap_sid2': '写你自己的',
'wxuin': '3340537333'
}
def get_params(offset):
params = {
'action': 'getmsg',
'__biz': '写你自己的',#相当于是当前公众号的id(唯一固定标志)
'f': 'json',
'offset': '{}'.format(offset),#文章数据接口请求偏移量标志(从0开始),每次返回的json数据中会有下一次请求的offset
'count': '10',#每次请求的数据量(亲测最多可以是10)
'is_ok': '1',
'scene': '126',
'uin': '777',
'key': '777',
'pass_ticket': '写你自己的',#可以理解是请求票据,而且隔一段时间后(大概几个小时)就会过期,
'appmsg_token': '写你自己的',#同样理解为非固定有过期策略的票据
'x5': '0',
'f': 'json',
}
发送请求
res = requests.get(base_url, headers=headers, params=get_params(offset), cookies=cookies)
data = json.loads(res.text)
解析获得的数据
can_msg_continue = data['can_msg_continue'] #can_msg_continue介绍标记符
next_offset = data['next_offset'] #下一篇文章的offset
general_msg_list = data['general_msg_list']
list_data = json.loads(general_msg_list)['list']
遍历获取到url,做出参数打印为pdf格式
for data in list_data:
try:
if data['app_msg_ext_info']['copyright_stat'] == 11: #copyright_stat=11表示原创
msg_info = data['app_msg_ext_info']
title = msg_info['title']
content_url = msg_info['content_url']
# 自己定义存储路径
pdfkit.from_url(content_url, 'C:\\Users\\Apple\\Desktop\\'+title+'.pdf')
print('获取到原创文章:%s : %s' % (title, content_url))
except:
print('不是图文')
循环判断
if can_msg_continue == 1:
time.sleep(1)
get_list_data(next_offset)
源码注意:
-
原创的文章才被爬取打印成pdf
-
文章只有图文组成才会打印成pdf
-
源码只需要修改请求的参数和cookie即可
-
运行项目的时候记得连上网,关掉fiddler代理
项目实战参考二:爬取天气和每日一句发邮件给女朋友
源码如下:
# 导入模块
import requests, json,smtplib
# 获取天气
def getWhether(city,link):
url = link+ city
r = requests.get(url).json()
msg = '\r\n亲爱的,今日天气是'+r['data']['forecast'][0]['type'] + '\r\n温度:'+r['data']['forecast'][0]['high'] + '--'+r['data']['forecast'][0]['low'] + '\r\n风:'+r['data']['forecast'][0]['fengli'][9:-3] +'--'+r['data']['forecast'][0]['fengxiang']+'\r\n\r\n'+r['data']['ganmao']+'\r\n'
return str(msg)
# 获取每日一句话
def getWord(link):
r = requests.get(link).json()
msg ='\r\n\r\n'+ r['content'] + ' \r\n'+ r['note']
return str(msg)
# 一些用到的数据
data = {
'link':'http://open.iciba.com/dsapi/',
'link2':'http://wthrcdn.etouch.cn/weather_mini?city=',
'city':'上海',
'first':'您的小可爱上线啦!\r\n',
'last':'\r\n\r\n ——最爱你的人儿~'
}
# 构造邮件的文本数据
msg = data['first'] +getWhether(data['city'],data['link2']) + getWord(data['link']) + data['last']
message = """From: From Person <发件人的邮箱>
To: To Person <收件人的邮箱>
Subject: 亲爱的。请点击查收!
This is a e-mail message.
""" + msg
# 发送邮件
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com',25)
smtp.login('发件人的邮箱', '邮箱授权码')#注意这里是邮箱授权码不是邮箱密码!
smtp.sendmail('发件人的邮箱', '收件人的邮箱', message.encode('utf-8'))
smtp.quit()
print('Done !')
注意:
-
通过代码发送邮件需要开启 开启POP3/SMTP服务,具体设置方式可以参考 https://jingyan.baidu.com/article/c275f6ba33a95de33d7567d9.html
-
smtp.login('发件人的邮箱', '邮箱授权码')#注意这里是邮箱授权码不是邮箱密码!如果设置成密码会报错