学习了大才哥的在线视频教程,特来这里总结分享一下。

不同于上一篇糗事百科的爬虫,这里爬取今日头条街拍需要分析ajax请求得来的数据。

首先这里是爬取的起始页

可以看到当我们往下拉滚动条的时候,新数据是即时生成的,也就是ajax发起的请求。

按F12 选中prelog,选中XHR,找到这样的请求,发现通过页面滚动,会生成只有offset不同的请求。

点击请求,选中preview选项卡,发现json格式的数据,其中的data里面article_url就是我们要找的每组网页的URL

接着点击article_url,进入其中一组图片的网页。接下来我们来找网页图片的连接地址。

在network中找到第一个请求,发现html中并没有要找的图片地址,而是在script中找到一个gallery变量,其中存储着图片的地址信息。

script中的信息无法使用bs4这样的解析器来解析,所以可以直接使用正则去匹配。

分析完毕,接下来开始编码。

首先获取索引页,找到header中get请求的参数,复制下来

使用urlencode为数组解析成get参数,接着使用requests请求,同时判断状态是否可以访问,可以的话返回response.text,最后不要忘记try catch起来,一般网页请求都是有可能出错的。

def get_page_index(offset, keyword):

data = {

'offset':offset,

'format':'json',

'keyword':keyword,

'autoload':'true',

'count':20,

'cur_tab':3

}

url = 'http://www.toutiao.com/search_content/?' + urlencode(data)

print('([%d] 正在下载索引页 %s' % (os.getpid(), url))

try:

response = requests.get(url)

if response.status_code == 200:

return response.text

return None

except RequestException:

print('请求索引页出错', url)

return None

接着从返回的response.text中,我们要解析出json数据中data中的article_rul。引入json库,编写parse_page_index函数

json.loads()函数直接将json数据解析成python字典,data.keys()可以获取所有的键。

yield 可以将函数变成生成器,后面可以使用for循环依次获取这个函数yield出来的值。

import json

def parse_page_index(html):

try:

data = json.loads(html)

if data and 'data' in data.keys():

for item in data.get('data'):

yield item.get('article_url')

except JSONDecodeError:

pass

解析出来article_url接着进入详情页,和前面的类似,我们之前判断是否能正确访问。

def get_page_detail(url):

print('([%d] 正在下载详细页 %s' % (os.getpid(), url))

try:

response = requests.get(url)

if response.status_code == 200:

return response.text

return None

except RequestException:

print('请求详情页出错', url)

return None

接着解析详情页。

将get_page_detail中返回的值,还有参数url作为参数传入parse_page_detail()中。

使用re.compile()制作匹配规则,获取gallery中的json变量存入result中。

同样使用json.loads()解析json串,(.*?)这样匹配的值通过result.group()获取,从1开始。

接着判断是否存在sub_images这个键。

使用这句话,直接获取sub_images中所有url组成列表。

images = [item.get('url') for item in sub_images]

有了图片url就可以编写下载图片的函数。最后return 图片信息的字典。

def parse_page_detail(html, url):

soup = BeautifulSoup(html, 'lxml')

title = soup.select('title')[0].get_text()

print(title)

images_pattern = re.compile('var gallery = (.*?);', re.S)

result = re.search(images_pattern, html)

if result:

data = json.loads(result.group(1))

if data and 'sub_images' in data.keys():

sub_images = data.get('sub_images')

images = [item.get('url') for item in sub_images]

for image in images: download_img(image)

return {

'title': title,

'url': url,

'images': images

}

接着将返回的数据存入mongoDB中。需要下载mongoDB,安装pymongo。

MONGO_URL是配置文件中链接的地址,localhost;  connect = False 防止多进程时出错。

MONGO_DB 数据库名称 , MONGO_TABLE数据库表名称。

mongoDB不用自己创表创建数据库,直接拿来用就行了,存入的json数据也自己解析好了。

import pymongo

client = pymongo.MongoClient(MONGO_URL, connect=False)

db = client[MONGO_DB]

def save_to_mongo(result):

if db[MONGO_TABLE].insert(result):

print('存储到MongoDB成功', result)

return True

return False

最后编写下载的部分。

首先还是判断是否可以正确访问,response.content,不同于response.text,返回的是二进制文件,适用于图片。

接着使用'{}’.format构造好存储地址。

os.getcwd()获取当前文件地址,md5函数使得相同的内容散列成相同的值。

def download_img(url):

print('([%d] 正在下载图片 %s' % (os.getpid(), url))

try:

response = requests.get(url)

if response.status_code == 200:

save_image(response.content)

return None

except RequestException:

print('请求图片出错', url)

return None

def save_image(content):

#print (os.path.abspath('.'))

#print (os.getcwd())

file_path = '{0}\images\{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg')

if not os.path.exists(file_path):

with open(file_path, 'wb') as f:

f.write(content)

f.close()

主函数

def main(offset):

print('获取索引页 (%d)' % offset)

html = get_page_index(offset, KEYWORD)

for url in parse_page_index(html):

html = get_page_detail( url)

if html:

result = parse_page_detail(html, url)

if result: save_to_mongo( result)

pass

起始代码

[x*20 for x in range(GROUP_START, GROUP_END)]

获取给定范围内x的20倍的列表,对应开头我们讲的页面滚动时,新的ajax请求时不同的offset。

使用进程池。

from multiprocessing import Pool

pool.map(main,groups)将groups中的值作为参数传入了main。

PROCESS_NUM指定进程数量。

if __name__ == '__main__':

groups = [x*20 for x in range(GROUP_START, GROUP_END)]

pool = Pool(processes=PROCESSE_NUM)

pool.map(main, groups)

配置文件config.py

MONGO_URL = 'localhost'

MONGO_DB = 'toutiao'

MONGO_TABLE = 'toutiao'

GROUP_START = 0

GROUP_END = 20

KEYWORD = '街拍'

PROCESSE_NUM = 8

成果图片

源代码

python爬取今日头条街拍,Python3今日头条街拍爬虫相关推荐

  1. python爬取网页内容requests_[转][实战演练]python3使用requests模块爬取页面内容

    本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取 ...

  2. python爬取豆瓣电影top250_【Python3爬虫教程】Scrapy爬取豆瓣电影TOP250

    今天要实现的就是使用是scrapy爬取豆瓣电影TOP250榜单上的电影信息. 步骤如下: 一.爬取单页信息 首先是建立一个scrapy项目,在文件夹中按住shift然后点击鼠标右键,选择在此处打开命令 ...

  3. python爬取大众点评_【Python3爬虫】大众点评爬虫(破解CSS反爬)

    本次爬虫的爬取目标是大众点评上的一些店铺的店铺名称.推荐菜和评分信息. 一.页面分析 进入大众点评,然后选择美食(http://www.dianping.com/wuhan/ch10),可以看到一页有 ...

  4. python爬取网页防止重复内容_python解决网站的反爬虫策略总结

    本文详细介绍了网站的反爬虫策略,在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下. 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.这里我们只讨论数据采集部分. 一般网站从三个方面 ...

  5. python爬取文字和图片_Python学习第七天之爬虫的学习与使用(爬取文字、图片、 视频)...

    [toc] 一.爬虫记得基本方法 1.1 爬虫概述 ​ 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. ...

  6. Python爬取淘宝商品数据,价值千元的爬虫外包项目

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 完整代码可以点击下方链 ...

  7. Python爬取彼岸图网10万张高清图片(入门级爬虫)_一蓑烟雨任平生

    来张爬取的美女镇楼 先上代码,再给你讲解 import re import requests import os import easygui(min, max) = easygui.multente ...

  8. python爬取网站美女图(附代码及教程)爬虫爬取海量手机壁纸,电脑壁纸,美女图片,风景图片等

    想要练习爬虫的兄弟们,可以看看这个 如果大神们看到有哪里可以改进的地方,请告诉小弟,我是个纯纯新手,练习了几次爬虫 以前一直用的BeautifulSoup,一直没有接触过正则表达式 正则表达式是一个非 ...

  9. python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫

    异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...

  10. php爬取房源,用python爬取二手房交易信息并进行分析

    用python爬取二手房交易信息并分析第一步:编写爬虫 爬取某平台上海市十个区共900条二手房的交易信息#爬取上海十个区的二手房价信息 import requests from bs4 import ...

最新文章

  1. Python语言精要---上
  2. 如何自动化识别异常数据?达到智能预警?
  3. ASP.NET Core 依赖注入-集成 Autofac
  4. Hibernate之映射
  5. 【Netty入门】TCP 粘包/拆包问题产生原因
  6. 程序员跳槽的7个常见理由,最后一个有人能看懂吗!
  7. 华为EMUI10的美学哲思:让美不止初见
  8. \n 屏幕换行 源码换行
  9. selenium弹窗无法定位_4.3 通过selenium 模拟浏览器抓取
  10. mmap文件做成html,mmap()映射到文件的一些总结
  11. FPGA_四选一数据选择器
  12. 椭圆型偏微分方程数值解法
  13. Windows下CURL编译 支持HTTPS
  14. 南阳OJ题目33---蛇形填数
  15. 技术经理成长复盘-处理线上问题
  16. 高德地图自定义镂空区域
  17. 如何让自己像打游戏一样发了疯、拼了命、石乐志的学习或者工作?
  18. 【Python】SymPy库——求泰勒展开式+求极限 代码实现
  19. 读书笔记-《ON JAVA 中文版》-摘要8[第八章 复用]
  20. 设计模式八(享元模式)

热门文章

  1. Java实现PDF在线预览
  2. 2020复旦计算机专硕考研复试经验
  3. 【附源码】计算机毕业设计JAVA学生学籍信息管理系统
  4. Oracle权限赋予的一些事
  5. java实现多重继承_Java 程序实现多重继承
  6. python游戏开发的第三方库有哪些_Python 游戏开发方向的第三方库是
  7. python 实现正弦波、三角波、方波、锯齿波
  8. 来算google的可视化编程工具——Blockly,不仅仅是玩具
  9. 新威电池测试仪软件打不开,新威电池测试仪软件使用教程
  10. html语言怎么标记音乐文件,添加背景音乐的html标签是什么?