其中遇到的问题和一些新知识:

1.

注意页面请求参数:(会改变)
即Query String Parameters
例:
今日头条里街拍综合的数据为
'offset': 0,
'format': 'json',
'keyword': '街拍',
'autoload': 'true',
'count': 20,
'cur_tab': 1,
'from': 'search_tab'
而实际上图集的为:
'offset': 0,
'format': 'json',
'keyword': '街拍',
'autoload': 'true',
'count': 20,
'cur_tab': 3,
'from': 'gallery'

2.
urlencode()方法
urlencode可以把字典对象变成url的请求参数
例:
from urllib.parse import urlencode
data = {
    'id':3,
    'keyword':"key",
    'count':20
}
url="https://www.baidu.com/?"+urlencode(data)
print(url)#https://www.baidu.com/?keyword=key&count=20&id=3

3.
关于使用正则获取的数据格式问题:
使用replace()方法调整
replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
语法:str.replace(old, new[, max])
例:
newresult = result.group(1).replace('\\','')#因为得到的数据中许多地方被插入了\,替换为空格即可得到正确格式

4.
json.loads()方法
将已编码的 JSON 字符串解码为 Python 对象
详情可见:http://www.runoob.com/python/python-json.html
5.
关于url变换的问题
当我们用爬虫获取的组图的URL并不是真实的地址,今日头条会重新定向
例:
获取的URL:http://toutiao.com/group/6511977315122020871/
实际该组图地址:https://www.toutiao.com/a6511977315122020871/
使用浏览器发现,当我们输入获取的URL时,网页会重新定向到实际地址,但是爬虫程序不能,所以找不到title
解决办法:
给get请求加上headers参数
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
response = requests.get(url,headers=headers)
完美解决!!!
6.
关于爬取次数过多被封ip:
(1)如果使用的是路由器重启路由器即可
(2)如果是拨号上网断网重新拨号即可
(3)使用代理

学习中参考链接:

https://blog.csdn.net/hanzheng6602/article/details/79183505

http://www.colabug.com/1774403.html

附:源代码

import json
import re
from hashlib import md5
from urllib.parse import urlencode
import os
import pymongo
import requests
from bs4 import BeautifulSoup
from requests import RequestException
from config import *#即可以把config里所有的变量引入
from multiprocessing import Pool#多进程#定义一个MongDB对象
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB2]#headers = {'user-agent': 'Windows / Chrome 34: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36'}
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
#获取页面索引
def get_page_index(offset,keyword):data = {'offset': offset,'format': 'json','keyword': keyword,'autoload': 'true','count': 20,'cur_tab': 3,'from': 'gallery'}url = 'https://www.toutiao.com/search_content/?' + urlencode(data)#urlencode可以把字典对象变成url的请求参数try:response = requests.get(url,headers=headers)if response.status_code == 200:return  response.textreturn Noneexcept RequestException:print("请求页面索引出错")return None#json解析函数
def parse_page_index(html):try:data = json.loads(html)#使用loads()方法把数据转换成json格式的变量(对象)if data and 'data' in data.keys():# data.keys()是json格式的data的所有键名#其中有两个判断,即data不为空和json格式的data变量里有data这个键名for item in data.get('data'):yield item.get('article_url')except ValueError:pass#详情页请求函数
def get_page_detail(url):try:response = requests.get(url,headers=headers)if response.status_code == 200:return  response.textreturn Noneexcept RequestException:print("请求详情页出错",url)return None#获取各个组图的title和属于其的列表的各种值
def parse_page_detail(html,url):soup = BeautifulSoup(html,'lxml')title = soup.select('title')[0].get_text()#使用css选择器,获得组图名称print(title)image_pattern = re.compile('gallery: JSON.parse\(\"(.*?)\"\)')#该处需注意,请根据实际返回(可能随时间改变)使用正则result = re.search(image_pattern,html)#查找是否存在image_patternif result:#如果result存在#print(result.group(1))#格式调整(此处也需注意,可能改变,需根据实际返回调整)newresult = result.group(1).replace('\\','')#因为得到的数据中许多地方被插入了\,替换为空格即可得到正确格式data = json.loads(newresult)#print(newresult)if data and 'sub_images' in data.keys():sub_images = data.get('sub_images')#获取键名为sub_images的值images = [item.get('url') for item in sub_images]#以数组形式得到组图中每张图片的urlfor image in images:#使用循环下载图片download_image(image)return {'title':title,'url':url,'images':images}
#存储到数据库函数
def save_to_mongo(result):if db[MONGO_TABLE].insert(result):#如果result插入数据库成功print('存储到MongoDB成功',result)return Truereturn False#下载图片
def download_image(url):print('正在下载',url)try:response = requests.get(url,headers=headers)if response.status_code == 200:save_image(response.content)#content属性返回的是二进制return Noneexcept RequestException:print("请求图片出错",url)return None
#保存图片到文件中
def save_image(content):file_path = '{0}/{1}.{2}'.format(os.getcwd()+'\picture',md5(content).hexdigest(),'jpg')#0,1,2分别为路径,文件名,后缀,md5()方法防止保存重复图片if not os.path.exists(file_path):#如果该文件不存在with open(file_path,'wb') as f:f.write(content)f.close()def main(offset):html = get_page_index(offset,keyword)for url in parse_page_index(html):#print(url)html = get_page_detail(url)#print(html)if html:result = parse_page_detail(html,url)if result:save_to_mongo(result)if __name__ == '__main__':#main()groups = [x*20 for x in range(GROUP_START,GROUP_END+1)]pool = Pool()pool.map(main,groups)

config.py文件

MONGO_URL = 'localhost'#url
MONGO_DB = 'toutiao'#数据库名称
MONGO_DB2 = 'toutiao2'#数据库名称
MONGO_TABLE = 'toutiao'#表名GROUP_START = 1
GROUP_END = 20keyword = '街拍'

今日头条街拍图片爬取相关推荐

  1. 今日头条街拍图片抓取

    爬取目标: 今日头条右上角输入:街拍 之后得到的是这样一个磨人的小妖精 分析网页之后发现是Ajax技术(我用的是Chrom的开发者工具,点XHR之后发现了常规的Ajax请求) 然后在细致的分析Prev ...

  2. 爬取今日头条街拍图片

    ** *爬取今日头条街拍图片 * ** # coding=utf-8 import os import re import time from multiprocessing.pool import ...

  3. Scrapy 爬取今日头条街拍图片

    scrapy 爬取今日头条图片保存至本地 之前用 requests 爬取过今日头条街拍的图片,当时只是爬取每篇文章的缩略图,今天尝试用 scrapy 来大规模爬取街拍详细图片. 分析页面 今日头条的内 ...

  4. Python爬虫:爬取今日头条“街拍”图片(修改版)

    前言 在参考<Python3网络爬虫开发实战>学习爬虫时,练习项目中使用 requests ajax 爬取今日头条的"街拍"图片,发现书上的源代码有些已经不适合现在了, ...

  5. 我的爬虫 之 爬今日头条街拍图片

    近日学习了python 爬虫方面的内容 ,决定实战--爬今日头条的街拍图片 首先先分析今日头条的请求方式,进入https://www.toutiao.com  F12 搜索街拍 查看当前请求 http ...

  6. python爬取今日头条_爬取今日头条街拍图片

    参考于崔庆才的Python爬虫教程,但是崔的视频时间过长,今日头条网站反爬虫也有了变化,因此写下此文章来记录自己的爬取过程遇到的问题,也给大家一些借鉴.欢迎大家讨论. 一.获取索引页. 我们会发现do ...

  7. 使用ajax爬取今日头条街拍图片

    文章目录 分析请求 获取一组信息 解析json 获取图片列表 本地存储 整合功能 分析请求 地址:https://www.toutiao.com/search/?keyword=%E8%A1%97%E ...

  8. python爬今日头条组图_python 爬虫抓取今日头条街拍图片

    1. 打开google浏览器,输入www.toutiao.com, 搜索街拍.html 2.打开开发者选项,network监看加载的xhr, 数据是ajax异步加载的,能够看到preview里面的da ...

  9. 分析Ajax爬取今日头条街拍图片

    # -*- coding:UTF-8 -*- import requests import time import os from hashlib import md5def get_page(off ...

最新文章

  1. Hadoop1 Centos伪分布式部署
  2. 漫画:你会感觉容器使用起来很痛苦吗?
  3. Fragment 源码解析
  4. .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
  5. 前端学习(486):css选择器上
  6. myeclipse试用小记----Hibernate多对一双向关联(2)
  7. 计算机二级晓云是企业人力,全国计算机二级MsOffice真题试卷wore
  8. ACM-ICPC 2018 南京赛区网络预赛 B The writing on the wall(暴力)
  9. 22.搜索大纲及重定向(Search Synonyms and Re-directs)
  10. 初级计算机处理员试题及答案,计算机软考信息技术处理员模拟试题及答案(1)[5]...
  11. 上海率先开放政府数据 医院床位车位信息均可查
  12. 【网络爬虫与信息提取】信息的组织与提取
  13. 2019 年技术大趋势预测
  14. 行业洞察系列之《事件管理的 5 个阶段及其改进建议》
  15. android搜索功能以及显示历史纪录带清除按钮
  16. 整型int数据的取值范围是怎么来的?
  17. [node.js] Promise中,resolve, reject 之后需不需要 return?
  18. etho失败,无法上网的解决方法
  19. 高职计算机专业英语词汇,职高英语单词复习
  20. linux查看.so导出函数

热门文章

  1. error An unexpected error occurred: “https://registry.npmjs.org/axios
  2. ARM_kafka搭建
  3. ceph课程(一)ceph组件与原理
  4. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug
  5. html网页肯德基设计代码作业,Illustrator设计一幅肯德基广告单页制作教程
  6. HDFS集群管理与运维+distcp工具的使用
  7. 物联网案例_讨论物联网采用的商业案例
  8. You have to use a classifier to attach supplemental artifacts to the project instead of replacing th
  9. 7-13 寻找大富翁 (25分)
  10. Unity3d+GameFramework:资源分析,资源依赖,循环依赖检测