女生勿扰,只适合男孩子的python爬虫,里面东西不给钱统统白送。
说真的,花了几天的时间来搞一个别人已经干过的项目,不知道是不是不值得,但是后面我自己上手做了之后,我才发现,这必须值得,崔大的书是2018年的,而现在网络的更新速度太快了,书本上的接口知识点都变了,废了老多时间才弄懂这些,不过我觉得也值,所以把代码加强了一下,实现了我的功能,下面做个简单的分享。
都2020年了还没爬过今日头条,你做爬虫是不是显得OUT了?但是没事,虽然现在的接口都变化了,那我就讲下2020年怎么搞今日头条妹子写真,这是一个改进的项目,里面参加了我自己的很多想法,比如有些很难懂的,我自己用简单的方式去实现了它,个人感觉还是实现的不错的,各位看官可以看看。
这个妹子觉得好看的评论区扣好看,直接教你怎么搞到手!
girls:
- 项目介绍:
- 项目技术:
- 简单的进程池:
- Ajax数据爬取:
- 项目作业:
- 最终作业效果图:
- 分析ajax接口获得数据:
- 数据包括:
- 第一点
- 第二点
- 第三点
- 获得数据
- 编写程序:
- 获得json文件:
- 获得标题和网址:
- 下载图片:
- 项目全部代码:
- 项目体会:
- 项目修复:
- 项目后记:
项目介绍:
利用简单的进程池
和Ajax数据爬取技术
对今日头条关键词页面进行分析
和处理
,然后获取每个页面的链接
,从而获得所有图片的链接
,然后打包下载
,
整个步骤我都会用小模块代码将其展示,实现不了的过来砍我
! 就是这么的负责我跟你们说。
项目技术:
简单的进程池:
这里对进程的了解我也不是很多,简单的说下项目需要的函数:
from multiprocessing import Pool # 调用函数库
p = Pool(4) # 构造一个进程池,单位为4
p.close() # 关闭进程
p.join() # 开启进程
对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
更多进程的知识点,还请各位大佬移步:廖老师的课堂
Ajax数据爬取:
网址的很多信息都不会直接全部出现在源代码里面,比如你刷网页,那些新刷出的网页就是一个个的通过ajax接口加载出来的,这是一种异步加载方式
,原始的页面不会包含很多数据,数据都放在一个个接口里面,只有我们请求这个ajax接口,然后服务器后台收到这个接口信息,才会把数据返回,然后JavaScript分析这个数据,在渲染到浏览器页面上,这就是我们看到的模式,
现在越来越多的网页都是采用这个异步加载的方式,爬虫就现得没那么容易了,这个概念的讲的也拗口,我们直接开始实战吧!
项目作业:
最终作业效果图:
分析ajax接口获得数据:
数据包括:
- 每个页面的标题
- 每个页面的网址
目标网址: 今日头条关键词妹子
怎么知道他是不是ajax接口,主要有三点:
第一点
注意我这几个箭头,只要你在这里·查找·里面找不到与文章对应的文字还是链接什么的,那就可能是。
第二点
在这个XHR里面找到箭头的网址,点击,查看预览,这个时候你随意打开里面的东西,就能发现很多与文章相同的点
第三点
还是这张图,你可以看到X-requested里面的接口是XMLHttpRequets
如果三点同时满足,那他就是Ajax接口,然后异步加载出来的数据。
获得数据
在第二点的那张图我们可以看到有0,1,2,3,4,之类的,打开你会发现,都在这里面,图中我用箭头标红了,有标题和页面链接,只要获得这个页面链接,那么就很简单了。
编写程序:
获得json文件:
首先请求最开始的页面: https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3
但是我们不能这样直接把页面交给requests库直接干,因为这是一个ajax接口,如果不加入参数,很可能让你输入什么验证码还是拉动验证条什么,反正就是很麻烦,那我们就加入参数,具体措施如下:
def get_page(offset): # offset偏移,因为每个ajax都是加载固定的页面数# 这里是20,在第三点图上可以看得到global headers # 全局变量 我后面还要用headers = {'cookie': 'tt_webid=6821518909792273933; WEATHER_CITY=%E5%8C%97%E4%BA%AC; SLARDAR_WEB_ID=b4a776dd-f454-43c6-81cd-bd37cb5fd0ec; tt_webid=6821518909792273933; csrftoken=4a2a6afcc9de4484af87a2ff8cba0638; ttcid=8732e6def0484fae975c136222a44f4932; s_v_web_id=verify_k9o5qf2w_T0dyn2r8_X6CE_4egN_9OwH_CCxYltDKYSQj; __tasessionId=oxyt6axwv1588341559186; tt_scid=VF6tWUudJvebIzhQ.fYRgRk.JHpeP88S02weA943O6b6-7o36CstImgKj1M3tT3mab1b','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Edg/81.0.416.68','referer': 'https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3','x-requested-with': 'XMLHttpRequest'} # 头信息 加入参数params = {'aid': ' 24','app_name': ' web_search','offset': offset,'format': ' json','keyword': ' 美女','autoload': ' true','count': ' 20','en_qc': ' 1','cur_tab': ' 1','from': ' search_tab','pd': ' synthesis','timestamp': int(time.time())}url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params) # 构造url, 使用到了urlencode() 函数 url = url.replace('=+', '=') # 这里必须注意现在的网址根本不一样# print(url) try:r = requests.get(url, headers=headers, params=params)r.content.decode('utf-8')if r.status_code == 200:return r.json() # 返回json格式 因为全是字典类型except requests.ConnectionError as e:print(e)
这里必须注意一点,请求的网址已经改掉了,我在代码里面给了解释,仔细看看。
获得标题和网址:
def get_image(json): # 获取图片if json.get('data'): # 如果这个存在for item in json.get('data'):if item.get('title') is None:continue # 如果标题是空值title = item.get('title') # 获取标题if item.get('article_url') == None:continueurl_page = item.get('article_url')# print(url_page)rr = requests.get(url_page, headers=headers)if rr.status_code == 200:pat = '<script>var BASE_DATA = .*?articleInfo:.*?content:(.*?)groupId.*?;</script>' # 用正则大致匹配一下范围match = re.search(pat, rr.text, re.S)if match != None:result = re.findall(r'img src=\\"(.*?)\\"', match.group(), re.S)# print(i.encode('utf-8').decode('unicode_escape')# 转换编码方式 把\u之类的改掉yield {'title': title,'image': result}
这里获取的网页链接都是Unicode格式的,在后面的下载部分,我给了修改方案,这也是一个暗坑。
下载图片:
def save_image(content):path = 'D://今日头条美女//' # 目录if not os.path.exists(path): # 创建目录os.mkdir(path)os.chdir(path)else:os.chdir(path)# ------------------------------------------if not os.path.exists(content['title']): # 创建单个文件夹if '\t' in content['title']: # 以title为标题创建单个文件夹title = content['title'].replace('\t', '') # 去除特殊符号 不然创建不了文件名称os.mkdir(title + '//')os.chdir(title + '//')print(title)else:title = content['title']os.mkdir(title + '//') # 创建文件夹os.chdir(title + '//')print(title)else: # 如果存在if '\t' in content['title']: # 以title为标题创建单个文件夹title = content['title'].replace('\t', '') # 去除特殊符号 不然创建不了文件名称os.chdir(title + '//')print(title)else:title = content['title']os.chdir(title + '//')print(title)for q, u in enumerate(content['image']): # 遍历图片地址列表u = u.encode('utf-8').decode('unicode_escape')# 先编码在解码 获得需要的网址链接# 开始下载r = requests.get(u, headers=headers)if r.status_code == 200:# file_path = r'{0}/{1}.{2}'.format('美女', q, 'jpg') # 文件的名字和地址,用三目运算符来调试文件夹的名字# hexdisgest() 返回十六进制图片with open(str(q) + '.jpg', 'wb') as fw:fw.write(r.content)print(f'该系列----->下载{q}张')
在U变量的时候进行了编码在解码操作,然后网址就正常很多了。
项目全部代码:
# -*- coding '':'' utf-8 -*-''
# @Time '':'' 2020/5/1 9:34''
# @author '':'' 沙漏在下雨''
# @Software '':'' PyCharm''
# @CSDN '':'' https://me.csdn.net/qq_45906219''import requests
from urllib.parse import urlencode # 构造url
import time
import os
from hashlib import md5
from lxml import etree
from bs4 import BeautifulSoup
import re
from multiprocessing.pool import Pooldef get_page(offset):global headersheaders = {'cookie': 'tt_webid=6821518909792273933; WEATHER_CITY=%E5%8C%97%E4%BA%AC; SLARDAR_WEB_ID=b4a776dd-f454-43c6-81cd-bd37cb5fd0ec; tt_webid=6821518909792273933; csrftoken=4a2a6afcc9de4484af87a2ff8cba0638; ttcid=8732e6def0484fae975c136222a44f4932; s_v_web_id=verify_k9o5qf2w_T0dyn2r8_X6CE_4egN_9OwH_CCxYltDKYSQj; __tasessionId=oxyt6axwv1588341559186; tt_scid=VF6tWUudJvebIzhQ.fYRgRk.JHpeP88S02weA943O6b6-7o36CstImgKj1M3tT3mab1b','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Edg/81.0.416.68','referer': 'https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3','x-requested-with': 'XMLHttpRequest'} # 头信息 加入参数params = {'aid': ' 24','app_name': ' web_search','offset': offset,'format': ' json','keyword': ' 美女','autoload': ' true','count': ' 20','en_qc': ' 1','cur_tab': ' 1','from': ' search_tab','pd': ' synthesis','timestamp': int(time.time())}url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params) # 构造urlurl = url.replace('=+', '=') # 网址根本不一样# print(url)try:r = requests.get(url, headers=headers, params=params)r.content.decode('utf-8')if r.status_code == 200:return r.json() # 返回json格式 因为全是字典类型except requests.ConnectionError as e:print(e)def get_image(json): # 获取图片if json.get('data'): # 如果这个存在for item in json.get('data'):if item.get('title') is None:continue # 如果标题是空值title = item.get('title') # 获取标题# if item.get('image_list') is None: # 进行判空# continue# urls = item.get('image_list') # 获得图片网址# for url in urls: # 遍历这个urls# url = url.get('url')# # 使用正则拼接网址# url = 'http://p1.pstatp.com/origin/' + 'pgc-image/' + url.split('/')[-1]if item.get('article_url') == None:continueurl_page = item.get('article_url')# print(url_page)rr = requests.get(url_page, headers=headers)if rr.status_code == 200:pat = '<script>var BASE_DATA = .*?articleInfo:.*?content:(.*?)groupId.*?;</script>'match = re.search(pat, rr.text, re.S)if match != None:result = re.findall(r'img src=\\"(.*?)\\"', match.group(), re.S)# for i in result:# print(i.encode('utf-8').decode('unicode_escape')# 转换编码方式 把\u之类的改掉yield {'title': title,'image': result}# 格式出错,这里产生了十六进制的数值, 网址获取不了,明天看# yield {# 'title': title,# 'image': url# } # 返回标题和网址def save_image(content):path = 'D://今日头条美女//' # 目录if not os.path.exists(path): # 创建目录os.mkdir(path)os.chdir(path)else:os.chdir(path)# ------------------------------------------if not os.path.exists(content['title']): # 创建单个文件夹if '\t' in content['title']: # 以title为标题创建单个文件夹title = content['title'].replace('\t', '') # 去除特殊符号 不然创建不了文件名称os.mkdir(title + '//')os.chdir(title + '//')print(title)else:title = content['title']os.mkdir(title + '//') # 创建文件夹os.chdir(title + '//')print(title)else: # 如果存在if '\t' in content['title']: # 以title为标题创建单个文件夹title = content['title'].replace('\t', '') # 去除特殊符号 不然创建不了文件名称os.chdir(title + '//')print(title)else:title = content['title']os.chdir(title + '//')print(title)for q, u in enumerate(content['image']): # 遍历图片地址列表u = u.encode('utf-8').decode('unicode_escape')# 先编码在解码 获得需要的网址链接# 开始下载r = requests.get(u, headers=headers)if r.status_code == 200:# file_path = r'{0}/{1}.{2}'.format('美女', q, 'jpg') # 文件的名字和地址,用三目运算符来调试文件夹的名字# hexdisgest() 返回十六进制图片with open(str(q) + '.jpg', 'wb') as fw:fw.write(r.content)print(f'该系列----->下载{q}张')def main(offset):json = get_page(offset)get_image(json)for content in get_image(json):try:# print(content)save_image(content)except FileExistsError and OSError:print('创建文件格式错误,包含特殊字符串:')continueif __name__ == '__main__':pool = Pool()groups = [j * 20 for j in range(8)]pool.map(main, groups) # 传offset偏移量pool.close()pool.join()
项目体会:
这是我第一个爬虫项目,之前都是很简单的,这一次有点麻烦,总之,对于困难我们还是别怕,不会就百度,一直百度一定出结果!
项目修复:
- 正确的拼接网址,修复了data = None 的bug,在获得json文件里面得到了体现
- 加入必要的参数,避免了验证码和验证条的出现,这也很棒 =。=
- 进行编码解码操作, 修改了\u格式下的链接不匹配问题,在获得网址的时候我也提到了
- 下载图片的时候使用了子文件夹的处理,让下载的图片不会那么杂乱
- 下载采用了简单的线程池问题,加快了下载的速度
项目后记:
2020年,没啥做了,只剩加油了。
女生勿扰,只适合男孩子的python爬虫,里面东西不给钱统统白送。相关推荐
- 女生勿扰,只适合男孩子的python爬虫,男生记得偷偷爬哦!
说真的,花了几天的时间来搞一个别人已经干过的项目,不知道是不是不值得,但是后面我自己上手做了之后,我才发现,这必须值得,崔大的书是2018年的,而现在网络的更新速度太快了,书本上的接口知识点都变了,废 ...
- python七夕快乐_七夕送小姐姐!女生勿扰,只适合男孩子的python爬虫!
点击上方蓝字关注我们! 今天情人节,福利:送妹子!! 都2020年了还没爬过今日头条,你做爬虫是不是显得OUT了?但是没事,虽然现在的接口都变化了,那我就讲下2020年怎么搞今日头条妹子写真,这是一个 ...
- 女生勿扰,男孩子python爬取了别把飞机打下来了?
说真的,花了几天的时间来搞一个别人已经干过的项目,不知道是不是不值得,但是后面我自己上手做了之后,我才发现,这必须值得,崔大的书是2018年的,而现在网络的更新速度太快了,书本上的接口知识点都变了,废 ...
- 学python要有多少英语词汇量测试_非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!...
最近朋友在苦学英文,但是又不知道自己学的怎么样了,直到有一天,他找到了扇贝网,里面有个"评估你的单词量"功能非常的好,就推荐给我了! 今天我们就用python做一个小的爬虫,然后自 ...
- python英语词汇量测试_非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!...
最近朋友在苦学英文,但是又不知道自己学的怎么样了,直到有一天,他找到了扇贝网,里面有个"评估你的单词量"功能非常的好,就推荐给我了! 今天我们就用python做一个小的爬虫,然后自 ...
- python爬虫英文单词_非常适合新手的一个Python爬虫项目:打造一个英文词汇量测试脚本...
最近朋友在苦学英文,但是又不知道自己学的怎么样了,直到有一天,他找到了扇贝网,里面有个"评估你的单词量"功能非常的好,就推荐给我了! 今天我们就用python做一个小的爬虫,然后自 ...
- 非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!
最近朋友在苦学英文,但是又不知道自己学的怎么样了,直到有一天,他找到了扇贝网,里面有个"评估你的单词量"功能非常的好,就推荐给我了! 今天我们就用python做一个小的爬虫,然后自 ...
- 学计算机的男孩子怎么追女孩子,男孩子追女孩子的套路,原来有这么多,快来学一学...
导语 你有没有喜欢的女孩子呢?那有没有跟她表白呢?或者有没有追到手呢?俗话说没吃过猪蹄也见过猪跑啊,追女孩子的套路虽然许多人在用,可是层出不穷的追女孩套路,你真的都了解吗?我们都知道女孩子喜欢男孩子是 ...
- 数据分析师只适合男生吗,女生可不可以胜任?
在大多数人眼中,理工科一般都是男生的天下,而适合女生的专业多数偏文艺类的路线.最近数据分析师很火,发展前景好,待遇也高,是人们眼中的高薪工作.于是乎数据分析师日益发展成为十分抢手的职业.数据分析师给人 ...
最新文章
- Linux网络服务基础
- ios手势识别-单击
- java 鼠标 停止工作原理,java系统级的键盘和鼠标状态
- C++ 程序不一定从 main 处开始执行
- linux磁盘响应慢,arch开机速度竟然是挂载磁盘拖慢了。。
- NeuralBuild-用于Java、C#、PHP的DAO产生器
- 网易云信流媒体服务端架构设计与实现
- 容器源码分析之TreeMap(十)
- mysql 日期和时间类型
- Interval(区间类问题)
- springMVC集成缓存框架Ehcache
- 有锚点的链接页面刷新的问题
- js混淆还原工具_技术分享:几种常见的JavaScript混淆和反混淆工具分析实战
- c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法
- 控制教程 —— 介绍篇:6.状态空间控制器设计
- AtCoder Beginner Contest 167 Solution
- web开发中添加分享按钮
- 线性空间的定义与性质
- 在微软工作是怎样一番体验
- Myth源码解析系列之二-项目结构介绍