Closed zhengbeiandy closed 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()
感谢贡献~
谢谢各位提供的事例代码。但是我在查看今日头条街拍的Ajax请求文件“Preview” 的时候其实并没有发现上述代码中的“cell_type”字段,而且‘data’字段下面根本没有像样的图片链接,甚至没有当前网页中的任何字段描述。所以我直接就运行上述代码。结果是确实会有内容被下载,但是查看文件名称会发现并不是当前网站中显示的内容,而且所有的标题文件夹下只有3张图片,通过搜索框搜索知道其实不应该只有3张图片。根据结果来看应该是被引导到其他的链接那里去了,而真正的链接被隐藏起来了。所以我想问这种反爬技术是一种什么技术,有什么方法可以应对呢?
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
为啥把响应里面的地址的list改为orign就是下载地址呀,求解释
为啥把响应里面的地址的list改为orign就是下载地址呀,求解释
改成origin下载原始图片,大图,不改的话下载下来的是小图
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.
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.
谢谢各位提供的事例代码。但是我在查看今日头条街拍的Ajax请求文件“Preview” 的时候其实并没有发现上述代码中的“cell_type”字段,而且‘data’字段下面根本没有像样的图片链接,甚至没有当前网页中的任何字段描述。所以我直接就运行上述代码。结果是确实会有内容被下载,但是查看文件名称会发现并不是当前网站中显示的内容,而且所有的标题文件夹下只有3张图片,通过搜索框搜索知道其实不应该只有3张图片。根据结果来看应该是被引导到其他的链接那里去了,而真正的链接被隐藏起来了。所以我想问这种反爬技术是一种什么技术,有什么方法可以应对呢?
莫法用了,有反爬机制,可以获取到详细页面的链接,但是拿不到详细页面的图片链接,有js动态渲染,利用selenium也不行啊
爬完文件都是空的
今日头条加了一个滑动图片验证。
想问一下我看Preview的URL比楼主写的多几个参数,分别是app_name=web_search, en_qc=1, timestamp=1558628221572。 最后有个timestamps,这个我用time.time()调完比较了一下,整数部分url里多了2~3位......以上3个不用写也可以爬吗?
想问一下我看Preview的URL比楼主写的多几个参数,分别是app_name=web_search, en_qc=1, timestamp=1558628221572。 最后有个timestamps,这个我用time.time()调完比较了一下,整数部分url里多了2~3位......以上3个不用写也可以爬吗?
解决了没 老哥 我爬下来的只有空文件夹 小白刚学被这代码搞蒙了 QAQ
爬不了了
出错啦![Errno 22] 文件名、目录名或卷标语法不正确。: 'img\海报街拍| 会穿衣的男人有多迷人?看看这些男明星吧!'
怎么解决
能成功请求,但解析不了,如何解决?
一样@Hostage2018,GROUP_END<4运行不会出错,但GROUP_END>=4运行会出错
怎么解决
路径里不能有空格
@Anodsaber 什么意思
我想问一下,为什么必须在base_url里就加上关键字就好使,放在params里拼接起来就识别不到data呢?
莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法
莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法
可以爬,我把image_list里面的都爬下来了
莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法
去看我公开的issue,第一个就是
莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法
可以爬,我把image_list里面的都爬下来了
确实可以用,原来需要把关键字直接拼接到地址里,加到params中无效。 同问, WHY ?
莫法用了, 爬下来的data为None, 该加的参数都加了,已目前的水平找不出破解办法
可以爬,我把image_list里面的都爬下来了
确实可以用,原来需要把关键字直接拼接到地址里,加到params中无效。 同问, WHY ?
楼上@ Anodsaber代码更新的非常完整 , 可以参考下
为啥把响应里面的地址的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 这个怎么解决呢?
为啥把响应里面的地址的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但的确显示的是一样的。所以对爬取没有影响
为啥把响应里面的地址的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"} 不知道怎么回事
想问一下我看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
爬不了了样
就因为这个教程 导致头条的网站一直被扒 反扒技术越来越成熟 哈哈
现在新加了一个滑动验证 所有的代码又不能用了 写完什么都爬不下来
今天看了下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()