精华内容
下载资源
问答
  • spider.pyimport jsonimport osfrom urllib.parse import urlencodeimport pymongoimport requestsfrom bs4 import BeautifulSoupfrom requests.exceptions import ConnectionErrorimport refrom multiprocessing im...

    spider.py

    import json

    import os

    from urllib.parse import urlencode

    import pymongo

    import requests

    from bs4 import BeautifulSoup

    from requests.exceptions import ConnectionError

    import re

    from multiprocessing import Pool

    from hashlib import md5

    from json.decoder import JSONDecodeError

    from config import *

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

    db = client[MONGO_DB]

    def get_page_index(offset, keyword):

    data = {

    'autoload': 'true',

    'count': 20,

    'cur_tab': 3,

    'format': 'json',

    'keyword': keyword,

    'offset': offset,

    }

    params = urlencode(data)

    base = 'http://www.toutiao.com/search_content/'

    url = base + '?' + params

    try:

    response = requests.get(url)

    if response.status_code == 200:

    return response.text

    return None

    except ConnectionError:

    print('Error occurred')

    return None

    def download_image(url):

    print('Downloading', url)

    try:

    response = requests.get(url)

    if response.status_code == 200:

    save_image(response.content)

    return None

    except ConnectionError:

    return None

    def save_image(content):

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

    print(file_path)

    if not os.path.exists(file_path):

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

    f.write(content)

    f.close()

    def parse_page_index(text):

    try:

    data = json.loads(text)

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

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

    yield item.get('article_url')

    except JSONDecodeError:

    pass

    def get_page_detail(url):

    try:

    response = requests.get(url)

    if response.status_code == 200:

    return response.text

    return None

    except ConnectionError:

    print('Error occurred')

    return None

    def parse_page_detail(html, url):

    soup = BeautifulSoup(html, 'lxml')

    result = soup.select('title')

    title = result[0].get_text() if result else ''

    images_pattern = re.compile('gallery: JSON.parse\("(.*)"\)', re.S)

    result = re.search(images_pattern, html)

    if result:

    data = json.loads(result.group(1).replace('\\', ''))

    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_image(image)

    return {

    'title': title,

    'url': url,

    'images': images

    }

    def save_to_mongo(result):

    if db[MONGO_TABLE].insert(result):

    print('Successfully Saved to Mongo', result)

    return True

    return False

    def main(offset):

    text = get_page_index(offset, KEYWORD)

    urls = parse_page_index(text)

    for url in urls:

    html = get_page_detail(url)

    result = parse_page_detail(html, url)

    if result: save_to_mongo(result)

    if __name__ == '__main__':

    pool = Pool()

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

    pool.map(main, groups)

    pool.close()

    pool.join()

    config.py

    MONGO_URL = 'localhost'

    MONGO_DB = 'toutiao'

    MONGO_TABLE = 'toutiao'

    GROUP_START = 1

    GROUP_END = 20

    KEYWORD='街拍'

    来源于微信公众号: 进击的Coder (ID:FightingCoder)

    展开全文
  • 今日头条爬虫 python

    2018-03-22 22:02:50
    今日头条爬虫。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
  • Python今日头条爬虫

    千次阅读 2018-02-23 15:53:44
    #将json格式的字符串转化成python对象,对象转换成json用 json.dumps() data=json.loads(html) if data and 'data' in data.keys(): for item in data.get('data'): #yield 是url生成器 即取出article_url并生成url ...
    encoding=utf8
    
    import requests
    from requests.exceptions import RequestException
    import urllib
    import json
    import re
    from bs4 import BeautifulSoup
    from config import *
    def get_index(offset,keyword):
    data={
    'offset':offset,
    'format':'json',
    'keyword':keyword,
    'autoload':'true',
    'count':20,
    'cur_tab':3
    }
    url='http://www.toutiao.com/search_content/?'+urllib.urlencode(data)
    response=requests.get(url)
    try:
    if response.status_code == 200:
    return response.text
    return None
    except RequestException:
    print u'请求索引页出错'
    return None
    def parse_page_index(html):
    #将json格式的字符串转化成python对象,对象转换成json用 json.dumps()
    data=json.loads(html)
    if data and 'data' in data.keys():
    for item in data.get('data'):
    #yield 是url生成器 即取出article_url并生成url
    yield item.get('article_url')
    def get_page_detail(url):
    response = requests.get(url)
    try:
    if response.status_code == 200:
    return response.text
    return None
    except RequestException:
    print '请求详情页出错'
    return None
    def parse_page_detail(html,url):
    soup=BeautifulSoup(html,'lxml')
    title = soup.select('title')[0].get_text()
    images_pattern= re.compile('var gallery = (.*?);',re.S)
    result = re.search(images_pattern,html)
    if result:
    data =json.loads(result.group(1))
    sub_images = data.get('sub_images')
    images = [item.get('url') for item in sub_images]
    return {
    'title' :title,
    'url':url,
    'images':images
    }
    def main():
    html=get_index(0,'街拍')
    for url in parse_page_index(html):
    html=get_page_detail(url)
    if html:
    result=parse_page_detail(html,url)
    print result['title']
    if name == 'main':
    main()

    展开全文
  • Python爬取今日头条街拍美图(你懂的)的爬虫.实现秒抓.
  • 参考链接:分析Ajax来抓取今日头条街拍美图Python爬虫入门—分析Ajax爬取今日头条美图爬虫(八):分析Ajax请求抓取今日头条街拍美图Python爬虫-分析Ajax抓取今日头条街拍美图...
    展开全文
  • 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。准备工作在本节开始之前,请确保已经安装...

    本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。

    准备工作

    在本节开始之前,请确保已经安装好requests库。如果没有安装,可以参考第1章。另外如果你对python的库不是很熟的话,建议先去小编的Python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,多跟里面的人交流,进步更快哦!

    抓取分析

    在抓取之前,首先要分析抓取的逻辑。打开今日头条的首页http://www.toutiao.com/,如图6-15所示。

    3edf10f9e2438dd71141eb299dbd36c3.png

    右上角有一个搜索入口,这里尝试抓取街拍美图,所以输入“街拍”二字搜索一下,结果如图6-16所示。

    5315bfa45470d7880f0f189fbd42f163.png

    这时打开开发者工具,查看所有的网络请求。首先,打开第一个网络请求,这个请求的URL就是当前的链接http://www.toutiao.com/search/?keyword=街拍,打开Preview选项卡查看Response Body。如果页面中的内容是根据第一个请求得到的结果渲染出来的,那么第一个请求的源代码中必然会包含页面结果中的文字。为了验证,我们可以尝试搜索一下搜索结果的标题,比如“路人”二字,如图6-17所示。

    480a814899f977057683c030c86fb788.png

    我们发现,网页源代码中并没有包含这两个字,搜索匹配结果数目为0。因此,可以初步判断这些内容是由Ajax加载,然后用JavaScript渲染出来的。接下来,我们可以切换到XHR过滤选项卡,查看一下有没有Ajax请求。

    不出所料,此处出现了一个比较常规的Ajax请求,看看它的结果是否包含了页面中的相关数据。

    点击data字段展开,发现这里有许多条数据。点击第一条展开,可以发现有一个title字段,它的值正好就是页面中第一条数据的标题。再检查一下其他数据,也正好是一一对应的,如图6-18所示。

    d0fd66546781d2f7018bef679bf1281a.png

    这就确定了这些数据确实是由Ajax加载的。

    我们的目的是要抓取其中的美图,这里一组图就对应前面data字段中的一条数据。每条数据还有一个image_detail字段,它是列表形式,这其中就包含了组图的所有图片列表,如图6-19所示。

    84456a2ad22101e1148d8b1862afb366.png

    因此,我们只需要将列表中的url字段提取出来并下载下来就好了。每一组图都建立一个文件夹,文件夹的名称就为组图的标题。

    接下来,就可以直接用Python来模拟这个Ajax请求,然后提取出相关美图链接并下载。但是在这之前,我们还需要分析一下URL的规律。

    切换回Headers选项卡,观察一下它的请求URL和Headers信息,如图6-20所示。

    37c34741cfdc9e41fe47b0e8146f8d1d.png

    图6-20 请求信息

    可以看到,这是一个GET请求,请求URL的参数有offset、format、keyword、autoload、count和cur_tab。我们需要找出这些参数的规律,因为这样才可以方便地用程序构造出来。

    接下来,可以滑动页面,多加载一些新结果。在加载的同时可以发现,Network中又出现了许多Ajax请求,如图6-21所示。

    3f04379bf3b430b8e2d63dbf105f488f.png

    这里观察一下后续链接的参数,发现变化的参数只有offset,其他参数都没有变化,而且第二次请求的offset值为20,第三次为40,第四次为60,所以可以发现规律,这个offset值就是偏移量,进而可以推断出count参数就是一次性获取的数据条数。因此,我们可以用offset参数来控制数据分页。这样一来,我们就可以通过接口批量获取数据了,然后将数据解析,将图片下载下来即可。

    实战演练

    我们刚才已经分析了一下Ajax请求的逻辑,下面就用程序来实现美图下载吧。另外如果你对ajax不熟的话,建议先去小编的Python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,多跟里面的人交流,进步更快哦!

    首先,实现方法get_page()来加载单个Ajax请求的结果。其中唯一变化的参数就是offset,所以我们将它当作参数传递,实现如下:

    import requests

    from urllib.parse import urlencode

    def get_page(offset):

    params = {

    'offset': offset,

    'format': 'json',

    'keyword': '街拍',

    'autoload': 'true',

    'count': '20',

    'cur_tab': '1',

    }

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

    try:

    response = requests.get(url)

    if response.status_code == 200:

    return response.json()

    except requests.ConnectionError:

    return None

    这里我们用urlencode()方法构造请求的GET参数,然后用requests请求这个链接,如果返回状态码为200,则调用response的json()方法将结果转为JSON格式,然后返回。

    接下来,再实现一个解析方法:提取每条数据的image_detail字段中的每一张图片链接,将图片链接和图片所属的标题一并返回,此时可以构造一个生成器。实现代码如下:

    def get_images(json):

    if json.get('data'):

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

    title = item.get('title')

    images = item.get('image_detail')

    for image in images:

    yield {

    'image': image.get('url'),

    'title': title

    }

    接下来,实现一个保存图片的方法save_image(),其中item就是前面get_images()方法返回的一个字典。在该方法中,首先根据item的title来创建文件夹,然后请求这个图片链接,获取图片的二进制数据,以二进制的形式写入文件。图片的名称可以使用其内容的MD5值,这样可以去除重复。相关代码如下:

    import os

    from hashlib import md5

    def save_image(item):

    if not os.path.exists(item.get('title')):

    os.mkdir(item.get('title'))

    try:

    response = requests.get(item.get('image'))

    if response.status_code == 200:

    file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(response.content).hexdigest(), 'jpg')

    if not os.path.exists(file_path):

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

    f.write(response.content)

    else:

    print('Already Downloaded', file_path)

    except requests.ConnectionError:

    print('Failed to Save Image')

    最后,只需要构造一个offset数组,遍历offset,提取图片链接,并将其下载即可:

    from multiprocessing.pool import Pool

    def main(offset):

    json = get_page(offset)

    for item in get_images(json):

    print(item)

    save_image(item)

    GROUP_START = 1

    GROUP_END = 20

    if __name__ == '__main__':

    pool = Pool()

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

    pool.map(main, groups)

    pool.close()

    pool.join()

    这里定义了分页的起始页数和终止页数,分别为GROUP_START和GROUP_END,还利用了多线程的线程池,调用其map()方法实现多线程下载。

    这样整个程序就完成了,运行之后可以发现街拍美图都分文件夹保存下来了,如图6-22所示。

    c65f3c387211dc441c1fa261b66715ec.png

    通过本节,我们了解了Ajax分析的流程、Ajax分页的模拟以及图片的下载过程。

    本节的内容需要熟练掌握,在后面的实战中我们还会用到很多次这样的分析和抓取

    展开全文
  • 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。1. 准备工作在本节开始之前,请确保已经...
  • html2.打开开发者选项,network监看加载的xhr, 数据是ajax异步加载的,能够看到preview里面的data数据python 3.下拉刷新查看加载的offset,每次加载20条数据,data是json数据,里面的article_url,是图集详情页的url...
  • import requestsimport reimport jsonimport osfrom urllib import requestheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.1...
  • AJAX 是一种用于创建快速动态网页的技术。...近期在学习获取js动态加载网页的爬虫,决定通过实例加深理解。1、首先是url的研究(谷歌浏览器的审查功能)http://www.toutiao.com/search_content/?offset=0&format=js...
  • 运行平台: WindowsPython版本: Python3.6IDE: Sublime Text其他工具: Chrome浏览器1、网页分析从打开今日头条首页,搜索“街拍”,下面有四个标签页“综合”、“视频”、“图集”和“用户”,我们依次点击几个...
  • 本文是学习 天善学院 Python3爬虫三大案例实战分享 / 分析Ajax抓取今日头条街拍美图 后所写,感谢崔庆才崔老师。天善学院 Python爬虫三大案例实战分享抓取的是街拍中的图集标签下的内容image.png流程:1. 抓取索引页...
  • 不同于上一篇糗事百科的爬虫,这里爬取今日头条街拍需要分析ajax请求得来的数据。首先这里是爬取的起始页可以看到当我们往下拉滚动条的时候,新数据是即时生成的,也就是ajax发起的请求。按F12 选中prelog,选中XHR...
  • 今天我们要爬取的仍然是图片,不过与上一篇有所不一样的是,今天爬取的是今日头条上的图集,接着往下看吧~运行平台:WindowsPython版本:Python3.6IDE: Sublime Text Python自带IDLE其他:Chrome浏览器简述流程为:...
  • # 今日头条--街拍import requestsfrom urllib.parse import urlencodeimport osfrom hashlib import md5from multiprocessing.pool import Pool# 根据 offset 得到每一个 ajax 请求返回的 jsondef get_json(offset):...
  • python爬虫爬取今日头条街拍美女图片,并按照标题建立文件夹保存在本地文件夹内
  • java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取(详细)一.此爬虫介绍今日头条本身就是做爬虫的,爬取各大网站的图片文字信息,再自己整合后推送给用户,特别是里面的动态图片,很有意思。在网上搜了...
  • 完整python项目,可以自己运行。利用python爬虫 爬取今日头条后台数据。然后使用flask框架 实现自己的后台 ,通过爬虫获取 今日头条数据。html实现前端 显示数据。网站UI一级界面自己实现,仿照今日头条网站
  • importjsonimporttimefrom urllib.parse importquotefrom urllib importrequestimportrequests"""1.综合2....微头条10.话题"""tab_list=["pd=synthesis&from=search_tab","pd=video&from...
  • #coding:utf-8importbase64importrandom, reimportsqlite3importredis, pickleimportjson, timeimporturllib3,urllib2,hashlibfrom datetime importdatetimeimportthreadingimportlogging.handlersimportsysreload(s...
  • 之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能...比如今日头条:浏览器呈现的网页如下图所示:查看源码,却是如下图所示:网页的新闻在HTML源码中一条都找不到,全是由JS动态生成加载。遇到这...
  • [Python3网络爬虫开发实战] --分析Ajax爬取今日头条街拍美图学习笔记--爬取今日头条街拍美图准备工作抓取分析实战演练 学习笔记–爬取今日头条街拍美图 尝试通过分析Ajax请求来抓取今日头条的街拍美图,抓取完成之后...
  • 几乎每一个代码都有注释,因为今日头条的加载有了变化,所以视频中的代码不能运行 # coding:utf-8 from bs4 import BeautifulSoup import requests import re import json from time import ctime import threading...
  • python_爬虫今日头条

    2017-07-27 20:45:27
    from urllib.parse import urlencode from requests.exceptions import RequestException import requests import json import re from bs4 import BeautifulSoup from config import * import pymongo ...
  • 课程链接讲师的公众号文章:今日头条数据抓取及持久化(完整代码版,含IP和用户代理)​mp.weixin.qq.com课程代码抓取并持久化user-agent工具utils.py对于爬虫工具,需要设置发起请求的user-agent,import fake-...
  • 今日头条我们以搜索’妹子’为例那 么 我 们 在 右 上 角 的 搜 索 框 搜 索 妹 子 , 出 来 了 一 系 列 文 章 那么我们在右上角的搜索框搜索妹子,出来了一系列文章那么我们在右上角的搜索框搜索妹子,出来了一系列...
  • 想问大家一个问题啊,大家学习Python爬虫的动力是什么呀?下面是我们有些同学的回答:1 .Python爬虫学好了,我可以找一个高薪的工作。...今天咱们就是爬取今日头条,你要问我为什么要爬取今日头条?...
  • 本节我们以今日头条为例来尝试通过分析 Ajax 请求来抓取网页数据的方法,我们这次要抓取的目标是今日头条的街拍美图,抓取完成之后将每组图片分文件夹下载到本地保存下来。 当然在学习Python的道路上肯定会困难,...
  • 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。 1. 准备工作 很多人学习python,不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 427
精华内容 170
关键字:

python今日头条爬虫

python 订阅
爬虫 订阅