Python3WebSpider / Jiepai

Jiepai Pictures of Toutiao
124 stars 142 forks source link

params和图片下载地址的更改,程序又能跑起来啦 #13

Closed zhengbeiandy closed 5 years ago

zhengbeiandy commented 5 years ago

今天看了下demo由于今日头条中参数的更改导致程序又跑不起来了,更改了下,现在又能跑起来了 import requests from urllib.parse import urlencode import os from hashlib import md5 from multiprocessing.pool import Pool import re

def get_page(offset): params = { 'aid':'24', 'offset': offset, 'format': 'json', 'autoload': 'true', 'count': '20', 'cur_tab': '1', 'from': 'search_tab', 'pd':'synthesis' } base_url = 'https://www.toutiao.com/api/search/content/?keyword=%E8%A1%97%E6%8B%8D' url = base_url + urlencode(params) try: resp = requests.get(url) print(url) if 200 == resp.status_code: print(resp.json()) return resp.json() except requests.ConnectionError: return None

def get_images(json): if json.get('data'): data = json.get('data') for item in data: if item.get('cell_type') is not None: continue title = item.get('title') images = item.get('image_list') for image in images: origin_image = re.sub("list", "origin",image.get('url')) yield { 'image': origin_image, 'title': title }

def save_image(item): img_path = 'img' + os.path.sep + item.get('title') print(img_path) if not os.path.exists(img_path): os.makedirs(img_path) try: resp = requests.get(item.get('image')) if 200 == resp.status_code: file_path = img_path + os.path.sep + '{file_name}.{file_suffix}'.format( file_name=md5(resp.content).hexdigest(), file_suffix='jpg') if not os.path.exists(file_path): with open(file_path, 'wb') as f: f.write(resp.content) print('Downloaded image path is %s' % file_path) else: print('Already Downloaded', file_path) except requests.ConnectionError: print('Failed to Save Image%s'%item)

def main(offset): json = get_page(offset) for item in get_images(json): print(item) save_image(item)

GROUP_START = 0 GROUP_END = 7

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

fanyang1997 commented 5 years ago

建议楼上使用正确的代码排版

import requests
from urllib.parse import urlencode
from requests import codes
import os
from hashlib import md5
from multiprocessing.pool import Pool
import re

def get_page(offset):
    params = {
        'aid': '24',
        'offset': offset,
        'format': 'json',
        #'keyword': '街拍',
        'autoload': 'true',
        'count': '20',
        'cur_tab': '1',
        'from': 'search_tab',
        'pd': 'synthesis'
    }
    base_url = 'https://www.toutiao.com/api/search/content/?keyword=%E8%A1%97%E6%8B%8D'
    url = base_url + urlencode(params)
    try:
        resp = requests.get(url)
        print(url)
        if 200  == resp.status_code:
            print(resp.json())
            return resp.json()
    except requests.ConnectionError:
        return None

def get_images(json):
    if json.get('data'):
        data = json.get('data')
        for item in data:
            if item.get('cell_type') is not None:
                continue
            title = item.get('title')
            images = item.get('image_list')
            for image in images:
                origin_image = re.sub("list", "origin", image.get('url'))
                yield {
                    'image':  origin_image,
                    # 'iamge': image.get('url'),
                    'title': title
                }

print('succ')

def save_image(item):
    img_path = 'img' + os.path.sep + item.get('title')
    print('succ2')
    if not os.path.exists(img_path):
        os.makedirs(img_path)
    try:
        resp = requests.get(item.get('image'))
        if codes.ok == resp.status_code:
            file_path = img_path + os.path.sep + '{file_name}.{file_suffix}'.format(
                file_name=md5(resp.content).hexdigest(),
                file_suffix='jpg')
            if not os.path.exists(file_path):
                print('succ3')
                with open(file_path, 'wb') as f:
                    f.write(resp.content)
                print('Downloaded image path is %s' % file_path)
                print('succ4')
            else:
                print('Already Downloaded', file_path)
    except requests.ConnectionError:
        print('Failed to Save Image,item %s' % item)

def main(offset):
    json = get_page(offset)
    for item in get_images(json):
        print(item)
        save_image(item)

GROUP_START = 0
GROUP_END = 7

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()
Germey commented 5 years ago

感谢贡献~

dlight-zzp commented 5 years ago

谢谢各位提供的事例代码。但是我在查看今日头条街拍的Ajax请求文件“Preview” 的时候其实并没有发现上述代码中的“cell_type”字段,而且‘data’字段下面根本没有像样的图片链接,甚至没有当前网页中的任何字段描述。所以我直接就运行上述代码。结果是确实会有内容被下载,但是查看文件名称会发现并不是当前网站中显示的内容,而且所有的标题文件夹下只有3张图片,通过搜索框搜索知道其实不应该只有3张图片。根据结果来看应该是被引导到其他的链接那里去了,而真正的链接被隐藏起来了。所以我想问这种反爬技术是一种什么技术,有什么方法可以应对呢?

jiangp000 commented 5 years ago

i am just wondering that where i should write my the location of the pictures that i will download. i am just a fresh man, so i will appreciate it so much if you could give me a hand

thomass0704 commented 5 years ago

为啥把响应里面的地址的list改为orign就是下载地址呀,求解释

zhongxunhui commented 5 years ago

为啥把响应里面的地址的list改为orign就是下载地址呀,求解释

改成origin下载原始图片,大图,不改的话下载下来的是小图

jiangp000 commented 5 years ago

i just want to know that where i can put the data into my computer. In other words, can you make a note at the codes to let us understand it more clearly? all of us would appreciate it if you can take it into sincere consideration.

wangjixun commented 5 years ago

i just want to know that where i can put the data into my computer. In other words, can you make a note at the codes to let us understand it more clearly? all of us would appreciate it if you can take it into sincere consideration.

Hi buddy! save_image is path of data. '''img_path + os.path.sep + '{file_name}.{file_suffix}''' just this.

yangtaupo commented 5 years ago

谢谢各位提供的事例代码。但是我在查看今日头条街拍的Ajax请求文件“Preview” 的时候其实并没有发现上述代码中的“cell_type”字段,而且‘data’字段下面根本没有像样的图片链接,甚至没有当前网页中的任何字段描述。所以我直接就运行上述代码。结果是确实会有内容被下载,但是查看文件名称会发现并不是当前网站中显示的内容,而且所有的标题文件夹下只有3张图片,通过搜索框搜索知道其实不应该只有3张图片。根据结果来看应该是被引导到其他的链接那里去了,而真正的链接被隐藏起来了。所以我想问这种反爬技术是一种什么技术,有什么方法可以应对呢?

莫法用了,有反爬机制,可以获取到详细页面的链接,但是拿不到详细页面的图片链接,有js动态渲染,利用selenium也不行啊

2717346533 commented 5 years ago

爬完文件都是空的

mengyuqianxun commented 5 years ago

今日头条加了一个滑动图片验证。

quanyj121 commented 5 years ago

想问一下我看Preview的URL比楼主写的多几个参数,分别是app_name=web_search, en_qc=1, timestamp=1558628221572。 最后有个timestamps,这个我用time.time()调完比较了一下,整数部分url里多了2~3位......以上3个不用写也可以爬吗?

2473518380 commented 5 years ago

想问一下我看Preview的URL比楼主写的多几个参数,分别是app_name=web_search, en_qc=1, timestamp=1558628221572。 最后有个timestamps,这个我用time.time()调完比较了一下,整数部分url里多了2~3位......以上3个不用写也可以爬吗?

解决了没 老哥 我爬下来的只有空文件夹 小白刚学被这代码搞蒙了 QAQ

vicent1234 commented 5 years ago

爬不了了

vicent1234 commented 5 years ago

出错啦![Errno 22] 文件名、目录名或卷标语法不正确。: 'img\海报街拍| 会穿衣的男人有多迷人?看看这些男明星吧!'

vicent1234 commented 5 years ago

怎么解决

Hostage2018 commented 5 years ago

能成功请求,但解析不了,如何解决?

vicent1234 commented 5 years ago

一样@Hostage2018,GROUP_END<4运行不会出错,但GROUP_END>=4运行会出错

Anodsaber commented 5 years ago

怎么解决

路径里不能有空格

vicent1234 commented 5 years ago

@Anodsaber 什么意思

MaxHjh commented 5 years ago

我想问一下,为什么必须在base_url里就加上关键字就好使,放在params里拼接起来就识别不到data呢?

geekbanana commented 5 years ago

莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法

MaxHjh commented 5 years ago

莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法

可以爬,我把image_list里面的都爬下来了

Anodsaber commented 5 years ago

莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法

去看我公开的issue,第一个就是

geekbanana commented 5 years ago

莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法

可以爬,我把image_list里面的都爬下来了

确实可以用,原来需要把关键字直接拼接到地址里,加到params中无效。 同问, WHY ?

MaxHjh commented 5 years ago

莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法

可以爬,我把image_list里面的都爬下来了

确实可以用,原来需要把关键字直接拼接到地址里,加到params中无效。 同问, WHY ?

楼上@ Anodsaber代码更新的非常完整 , 可以参考下

OKdongge commented 5 years ago

为啥把响应里面的地址的list改为orign就是下载地址呀,求解释

改成origin下载原始图片,大图,不改的话下载下来的是小图 只是将list修改为origin,图片的url是错的哦!例如 小图的url:http://p3-tt.byteimg.com/list/300x196/pgc-image/ff30cdae588348c980d01c1b4234f1f3

大图的url:http://p3.pstatp.com/large/pgc-image/ff30cdae588348c980d01c1b4234f1f3 这个怎么解决呢?

TylerYu232 commented 5 years ago

为啥把响应里面的地址的list改为orign就是下载地址呀,求解释

改成origin下载原始图片,大图,不改的话下载下来的是小图 只是将list修改为origin,图片的url是错的哦!例如 小图的url:http://p3-tt.byteimg.com/list/300x196/pgc-image/ff30cdae588348c980d01c1b4234f1f3

大图的url:http://p3.pstatp.com/large/pgc-image/ff30cdae588348c980d01c1b4234f1f3 这个怎么解决呢?

你试一试把小图的url里的list改成origin的话的确是会显示一样的图片的虽然一个是http://p1.pstatp.com另外一个是http://p9-tt.byteimg.com但的确显示的是一样的。所以对爬取没有影响

OKdongge commented 5 years ago

为啥把响应里面的地址的list改为orign就是下载地址呀,求解释

改成origin下载原始图片,大图,不改的话下载下来的是小图 只是将list修改为origin,图片的url是错的哦!例如 小图的url:http://p3-tt.byteimg.com/list/300x196/pgc-image/ff30cdae588348c980d01c1b4234f1f3

大图的url:http://p3.pstatp.com/large/pgc-image/ff30cdae588348c980d01c1b4234f1f3 这个怎么解决呢?

你试一试把小图的url里的list改成origin的话的确是会显示一样的图片的虽然一个是http://p1.pstatp.com另外一个是http://p9-tt.byteimg.com但的确显示的是一样的。所以对爬取没有影响

返回的是这个欸? {"error":"fail on get for 300x196/pgc-image/ff30cdae588348c980d01c1b4234f1f3, code=404 message=Not Found remoteAddr=10.24.31.68:8789 reqID=aae79724897dbedd"} 不知道怎么回事

lblblb7777 commented 5 years ago

想问一下我看Preview的URL比楼主写的多几个参数,分别是app_name=web_search, en_qc=1, timestamp=1558628221572。 最后有个timestamps,这个我用time.time()调完比较了一下,整数部分url里多了2~3位......以上3个不用写也可以爬吗?

timestamp=1558628221572 这个是毫秒级的,time.time()还要乘以1000再取整,不过我获取到的json数据里data是NONE

Duanxiaoer commented 5 years ago

爬不了了样

annonmous99 commented 5 years ago

就因为这个教程 导致头条的网站一直被扒 反扒技术越来越成熟 哈哈

annonmous99 commented 5 years ago

现在新加了一个滑动验证 所有的代码又不能用了 写完什么都爬不下来