精华内容
下载资源
问答
  • 爬虫今日头条

    千次阅读 2018-05-25 09:18:18
    #不加头直接get,有可能遇到反爬虫 # 帖子请求成功才返回 #print('result= ' , response) if response.status_code == 200: return response.text return None except: return None def parse_page_detail...
    #coding=utf-8
    import json
    from _md5 import md5
    from multiprocessing.pool import Pool
    import re
    import os
    import requests
    from urllib.parse import urlencode
    from bs4 import BeautifulSoup
    START_OFFSET = 0
    END_OFFSET = 10
    
    # 链接mongodb数据库,多进程这里可能会报警告
    #client = pymongo.MongoClient(MONGO_URL,connect=False)
    # 定义一个数据库
    #   db = client[MONGO_DB]
    
    KEYWORD='脉动'
    HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
    }
    
    
    def get_page_list(offset,keyword):
        '''
           获取主页面所有帖子的链接
        '''
        # 请求ajax的一些参数,通过浏览器F12看到的
        params = {
            'offset': offset,
            'format': 'json',
            'keyword': keyword,
            'autoload': 'true',
            'count': '20',
            'cur_tab': 1,
            'from': 'search_tab'
        }
        # from urllib.parse import urlencode  # 用下面这种要import这个
        # url解析自带的,就是把那个参数弄成一个链接,教程用的是下面这种方式把参数和url拼接
        url = 'https://www.toutiao.com/search_content/?' + urlencode(params)
    
        #url = 'https://www.toutiao.com/search_content'
        try:
            # 我是把参数传入到get请求里面,如果用上面那种,这里的params形参就要删掉
            #response = requests.get(url,headers = HEADERS,params=params)
            response = requests.get(url)
            # 因为要返回的是一个文本,所以用response.text,若要返回二进制数据,用response.content
            return response.text
        except:
            # 可能会url请求出错,避免停止,捕获一下异常
            return None
    
    def parse_page_list(html):
        '''
        解析主页,取得帖子的链接
        '''
        # 把得到的ajax弄成一个json,方便处理,另外,注意是loads不是load
        data = json.loads(html)
        # 下面的内容是分析浏览器F12的network中的各种数据得到的
        if data and 'data' in data.keys():
            # 数据是层层字典嵌套的,一步步取出来
            for item in data.get('data'):
                # 这个yield如果不懂可以理解为return的高级版本
                yield item.get('article_url')
    
    def get_page_detail(url):
        '''
        根据主页的那些链接,访问帖子
        '''
        try:
            #print('find')
            response = requests.get(url,headers=HEADERS)
            #不加头直接get,有可能遇到反爬虫
            # 帖子请求成功才返回
            #print('result= ' , response)
            if response.status_code == 200:
                return response.text
            return None
        except:
            return None
    
    def parse_page_detail(html):
        #爬取帖子里面的所以照片链接和帖子名称
        try:
            # 一开始用的正则,有点小错误,直接拿汤器祭神
            #print('~~')
            soup = BeautifulSoup(html, 'lxml')
            #print('44')
            # 用选择,直接找到项目为title的内容
            title = soup.select('title')[0].get_text()
            #print(title)
            # 这是图片的正则模式
            #pattern = re.compile('"(http://p3.pstatp.com/origin/213a0000d62a02db7e89)"', re.S)
            #pattern = re.compile('"(http:.*?)"', re.S)
            pattern = re.compile('"(http:.*?)"', re.S)
            #把所有包含http的内容均储存下来
            #pattern = re.compile('articleInfo:.*?title: \'(.*?)\'.*?content.*?\'(.*?)\'', re.S)
            #pattern = re.compile('gallery:=(.*?);', re.S)#先匹配到http
            #result = re.search(pattern,html) #对字符串进行解析
            #print(result)
            #if result:
            #    data = json.loads(result)
            #pattern = re.compile('articleInfo:.*?title: \'(.*?)\'.*?content.*?\'(.*?)\'', re.S)
            #re模块提供对正则表达式的支持,获取一个匹配结果
            # 找到所有的图片链接
            images = re.findall(pattern,html)
            #把找到的信息作为数组存储在里面
        except:
            return None
            # 以特定格式返回,title是str,images是list
        return {
            'title':title,
            'images':images
        }
    
    def save_to_mongo(result):
        '''
        存储
        {
            'title':title,
            'images':images
        }
        '''
        # 把结果插入到表MONGO_TABLE中,成功返回True,失败False
        if db[MONGO_TABLE].insert(result):
            print('存到mongodb成功: ',result['title'])
            return True
        return False
    
    def download_save_image(url):
        '''
        下载图片,并保存到本地
        '''
        try:
            # 封装请求
            #print('to find' ,url)
            response = requests.get(url,headers=HEADERS)
            # 如果是图片就返回content好,如果是网页就text
            content = response.content
            #print(content)
            # 图片的存路径,因为图片可能会重复,所以加一个md5的命名规则,避免重复下载
            file_path = '{0}/images/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(),'jpg')
            #os.getcwd()为目前的相对路径
            #
            # 我是把图片都放在images文件夹下,如果还要分得更细,可以再创建一个"./images/图片集名字"这样的文件夹
            dir = '{0}/images'.format(os.getcwd())
            # 如果没有images文件夹,就新建一个
            if not os.path.exists(dir):
                os.mkdir(dir)
            # 这个就是创建图片(因为用了md5,所以不允许有重复的图片)
            if not os.path.exists(file_path):
                with open(file_path,'wb') as f:
                    f.write(content)
                print('图片保存成功:'+url)
        except:
            return None
    
    def main(offset):
        # 获取主页html
        html = get_page_list(offset,KEYWORD)
        # 解析上面的html得到链接
        url_list = parse_page_list(html)
        for url in url_list:
            # 进入详情页
            #print(url)
            html = get_page_detail(url)
            if html:
                #continue
                #print('before',html)
                # 得到详情页的图片链接
                result = parse_page_detail(html)
                #print(result)
                # 如果图片链接结果不为空
                if result and result['images']:
                #     # 先存相关信息到mongo
                #     save_to_mongo(result)
                #     # 再下载一份到本地
                     for url in result['images']:#如果里面存在image
                         url = url.replace('\\', '')#这里多出来的\\可以替换掉
                         len1 = len(url)
                         if url[7] != 'p' or len1 <= 21:
                             continue
                         #print(url)#这里得到的url为正则得到的url
                         download_save_image(url)
    
    if __name__ == '__main__':
        # 三行加起来是并行进行
        #main(1)
        #l = [i*20 for i in range(START_OFFSET,END_OFFSET)]
        pool = Pool()
        pool.map(main,0)
        #l = [i*20 for i in range(START_OFFSET,END_OFFSET)]
       # pool = Pool()
       # pool.map(main,l)


    展开全文
  • 参考链接:分析Ajax来抓取今日头条街拍美图Python爬虫入门—分析Ajax爬取今日头条美图爬虫(八):分析Ajax请求抓取今日头条街拍美图Python爬虫-分析Ajax抓取今日头条街拍美图...
    展开全文
  • 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)

    展开全文
  • 说明爬取今日头条街拍美图,并保存到MongoDB中### 2.准备[安装requests库](/1kai-fa-huan-jing-pei-zhi/12-qing-qiu-ku-de-an-zhuang/121-requestsde-an-zhuang.md)### 3.抓取分析链接:...

    ### 1.说明

    爬取今日头条街拍美图,并保存到MongoDB中

    ### 2.准备

    [安装requests库](/1kai-fa-huan-jing-pei-zhi/12-qing-qiu-ku-de-an-zhuang/121-requestsde-an-zhuang.md)

    ### 3.抓取分析

    链接:[https://www.toutiao.com/search/?keyword=街拍](https://www.toutiao.com/search/?keyword=街拍)

    ![](/assets/6.4-1.png)打开开发者工具 > Network面板>选中XHR,筛选ajax请求

    分析[https://www.toutiao.com/search\_content/?offset=0&format=json&keyword=街拍&autoload=true&count=20&cur\_tab=1&from=search\_tab](https://www.toutiao.com/search_content/?offset=0&format=json&keyword=街拍&autoload=true&count=20&cur_tab=1&from=search_tab)链接

    可以看到有几个参数,往下不停刷新,可以得到几个重要参数的含义

    offset:偏移量,每次刷新后,从第几条开始显示的数据

    keyword:搜索关键字

    count:显示的数据条数

    ### 4. 实战演练 {#3-实战演练}

    ```

    import requests,os

    from urllib.parse import urlencode

    from multiprocessing import Pool

    from hashlib import md5

    baseurl = "https://www.toutiao.com/search_content/?"

    headers = {

    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36',

    'x-requested-with': 'XMLHttpRequest',

    }

    GROUP_START = 1

    GROUP_END = 20

    def get_page(offset=0):

    params = {

    'offset': offset,

    'format': 'json',

    'keyword': '街拍',

    'autoload': 'true',

    'count': '20',

    'cur_tab': '1',

    'from': 'search_tab',

    }

    url = baseurl + urlencode(params)

    try:

    response = requests.get(url,headers=headers)

    if response.status_code == 200:

    return response.json()

    except requests.ConnectionError as e:

    print(e.args)

    def get_images(response):

    if response:

    items = response.get("data")

    if items:

    for item in items:

    title = item.get("title")

    images = item.get("image_list")

    if title and images:

    for image in images:

    yield {

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

    'title': title,

    }

    def save_images(item):

    title = item.get("title")

    if not os.path.exists(title):

    os.mkdir(title)

    try:

    image = item.get("image")

    response = requests.get("http:"+image)

    if response.status_code == 200:

    # 读取二进制流数据

    content = response.content

    # 利用md5函数判断重复

    filepath = "{0}/{1}.{2}".format(title,md5(content).hexdigest(),'jpg')

    if not os.path.exists(filepath):

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

    f.write(response.content)

    else:

    print("Already Download {}".format(filepath))

    except requests.ConnectionError as e:

    print("Failed to Save Image")

    def main(offset=0):

    response = get_page(offset)

    for item in get_images(response):

    print(item)

    save_images(item)

    if __name__ == "__main__":

    # 开启进程池

    pool = Pool()

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

    print(groups)

    pool.map(main,groups)

    pool.close()

    pool.join()

    ```

    ![](/assets/6.4-10.png)

    展开全文
  • 几乎每一个代码都有注释,因为今日头条的加载有了变化,所以视频中的代码不能运行 # 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 ...
  • 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。准备工作在本节开始之前,请确保已经安装...
  • 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。1. 准备工作在本节开始之前,请确保已经...
  • 这几天在用手机版的APP头条时会发现,它开放了一个疫情数据的展示页面,作为一个有理想有抱负的,从事数据工作方面的程序员来说,想到了把他的数据拿下来就好了,这样我们自己也可以做一些数据处理的工作,从而进行...
  • from urllib.parse import urlencodeimport refrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoupimport requestsimport jsondef get_page_index(offset,keyword):#定义一个函数用于...
  • 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。1. 准备工作在本节开始之前,请确保已经...
  • 今日头条是一个js动态加载的网站,尝试了两种方式爬取,一是页面直接提取,一是通过接口提取:version1:直接页面提取#coding=utf-8#今日头条from lxml importetreeimportrequestsimporturllib2,urllibdefget_url():...
  • 在网上看到了一个demo,使用的是Jsoup,我拿过来修改了一下,由于今日头条的文章的特殊性,所以无法直接获取文章的地址,需要获取文章的id然后在拼接成url再访问.public class Demo2 {public static void main(String[] ...
  • 前言需要提前说下的是,由于今日头条的文章的特殊性,所以无法直接获取文章的地址,需要获取文章的id然后在拼接成url再访问。下面话不多说了,直接上代码。示例代码如下public class Demo2 {public static void main...
  • AJAX 是一种用于创建快速动态网页的技术。...近期在学习获取js动态加载网页的爬虫,决定通过实例加深理解。1、首先是url的研究(谷歌浏览器的审查功能)http://www.toutiao.com/search_content/?offset=0&format=js...
  • python爬虫爬取今日头条街拍美女图片,并按照标题建立文件夹保存在本地文件夹内
  • 课程链接讲师的公众号文章:今日头条数据抓取及持久化(完整代码版,含IP和用户代理)​mp.weixin.qq.com课程代码抓取并持久化user-agent工具utils.py对于爬虫工具,需要设置发起请求的user-agent,import fake-...
  • 今日头条是一个js动态加载的网站,尝试了两种方式爬取,一是页面直接提取,一是通过接口提取: version1:直接页面提取 #coding=utf-8 #今日头条 from lxml import etree import requests import urllib2,...
  • 今日头条 的数据都是用 Ajax 技术加载渲染完成,打开 今日头条 页面源码,连一根鸡毛都没有。 在我们爬虫界,按照 ‘可见即可爬’ 的原则, 所谓的 Ajax 就是 ’换一个页面‘ 爬取我们想要爬取的资源。...
  • 爬虫爬取今日头条街拍美图 项目环境: pycharm sslenium、requests等库的安装 代码呈现: import requests,re,os from hashlib import md5 from multiprocessing.pool import Pool from selenium import webdriver...
  • 爬虫主函数 1 defmain(offset):2 html =get_page_index(offset, KEYWORD)3 for url inparse_page_index(html):4 html =get_page_detail(url)5 ifhtml:6 result =parse_page_detail(html, url)7 if result: save_to_...
  • 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...
  • 今日头条爬虫 python

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

    2021-05-06 18:15:06
    前言:这是一个《python3网络爬虫实战开发》的项目,无奈今日头条进行了更新,导致作者的源代码不可用。这里对bug进行了修复,更改。修改条目:添加的cookies等头文件,使今日头条返回...
  • 最近在学习搜索方面的东西,需要了解网络爬虫方面的知识,虽然有很多开源的强大的爬虫,但本着学习的态度,想到之前在做资讯站的时候需要用到爬虫来获取一些文章,今天刚好有空就研究了一下.在网上看到了一个demo,...
  • 爬虫爬取今日头条街拍美图

    千次阅读 2019-01-19 10:24:01
    1 在抓取之前,首先要分析抓取的逻辑,打开今日头条的首页http://www.toutiao.com/ 2 右上角有一个搜索入口,这里尝试抓取街拍美图,所以输入“街拍”二字搜索一下。 3 分析数据 4 我们的目的是要抓取...

空空如也

空空如也

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

爬虫今日头条

爬虫 订阅