鱼C论坛

 找回密码
 立即注册
查看: 4611|回复: 25

[已解决]如何爬取豆瓣读书的图书信息

[复制链接]
发表于 2018-3-14 17:33:11 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 lyjlyj 于 2018-3-14 18:30 编辑

爬取豆瓣图书信息,直接异常了,使用代理也会异常
  1. #-*- coding:utf-8 -*-
  2. import requests
  3. import random
  4. proxies = ["115.223.232.2:9000","60.16.214.254:9000","115.223.207.122:9000","122.114.31.177:808","125.121.116.163:808"]
  5. headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400"}
  6. url = "https://book.douban.com/tag/小说?start=0&type=T"
  7. response = requests.get(url,headers=headers,proxies={"http":"http://"+random.choice(proxies)})
  8. print(response.status_code)
  9. print(response.text)
复制代码
最佳答案
2018-3-14 17:33:12
本帖最后由 Charles未晞 于 2018-3-14 19:57 编辑

浏览器无痕模式打开豆瓣,把cookie值取下来,多取几个,每爬一页随机用一个cookie。
没有登录信息的cookie很容易导致你ip被封,一般被封半天。
加上了登录信息的cookie一般你爬取几千条数据没什么问题。
几个被封的姿势我差不多都经历到了。。。
谨慎使用。我豆瓣账号被封了三天过。
最后:https://mp.weixin.qq.com/s/eFW4IIH2YejdzopwgEmBJQ
QQ拼音截图未命名.jpg

网站成这样了

网站成这样了

最佳答案

查看完整内容

浏览器无痕模式打开豆瓣,把cookie值取下来,多取几个,每爬一页随机用一个cookie。 没有登录信息的cookie很容易导致你ip被封,一般被封半天。 加上了登录信息的cookie一般你爬取几千条数据没什么问题。 几个被封的姿势我差不多都经历到了。。。 谨慎使用。我豆瓣账号被封了三天过。 最后:https://mp.weixin.qq.com/s/eFW4IIH2YejdzopwgEmBJQ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 17:33:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Charles未晞 于 2018-3-14 19:57 编辑

浏览器无痕模式打开豆瓣,把cookie值取下来,多取几个,每爬一页随机用一个cookie。
没有登录信息的cookie很容易导致你ip被封,一般被封半天。
加上了登录信息的cookie一般你爬取几千条数据没什么问题。
几个被封的姿势我差不多都经历到了。。。
谨慎使用。我豆瓣账号被封了三天过。
最后:https://mp.weixin.qq.com/s/eFW4IIH2YejdzopwgEmBJQ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 17:43:45 | 显示全部楼层
没有把问题说清楚,无法提供帮组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 17:52:57 | 显示全部楼层
直接贴网址和目标信息吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 18:01:00 | 显示全部楼层
上代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 18:01:36 | 显示全部楼层
你要爬什么信息都不说,谁知道你要干嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-14 18:27:16 | 显示全部楼层
本帖最后由 lyjlyj 于 2018-3-14 18:28 编辑
°蓝鲤歌蓝 发表于 2018-3-14 17:52
直接贴网址和目标信息吧。


这是部分代码,之前写的太乱了,没使用代理之前被检测到了,使用代理之后,为什么还会检测到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-14 18:29:14 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-3-14 17:52
直接贴网址和目标信息吧。

重新用代理试了一下,结果成这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 19:53:24 | 显示全部楼层
lyjlyj 发表于 2018-3-14 18:29
重新用代理试了一下,结果成这样了
  1. import requests
  2. import random
  3. import time

  4. url = 'https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4?start=0&type=T'

  5. headers = {'Host':'book.douban.com',
  6.             'Upgrade-Insecure-Requests':'1',
  7.         'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
  8.             Chrome/64.0.3282.119 Safari/537.36',
  9.         }

  10. response = requests.get(url, headers=headers)
  11. print(response.text)
复制代码


亲测可用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 19:57:24 | 显示全部楼层
关于代理问题的评价:我做过西刺代理的代理池代码,说白了那玩意就是骗小孩子的。
爬大型网站基本没有任何用处,搞事情一般都需要购买一些代理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-14 20:40:55 | 显示全部楼层
本帖最后由 lyjlyj 于 2018-3-14 20:42 编辑
Charles未晞 发表于 2018-3-14 19:55
浏览器无痕模式打开豆瓣,把cookie值取下来,多取几个,每爬一页随机用一个cookie。
没有登录信息的cookie ...


为什么我使用使用模拟登录后,每次返回的代码都是一样的,我用的session.get发送,就得到了这样的结果
QQ拼音截图11未命名.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-14 20:52:42 | 显示全部楼层

少数是可以,但是请求多了就不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 20:55:52 | 显示全部楼层
lyjlyj 发表于 2018-3-14 20:52
少数是可以,但是请求多了就不行了

那就设置代理,时间间隔等等反爬措施。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-14 21:26:23 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-3-14 20:55
那就设置代理,时间间隔等等反爬措施。

那些免费代理经常不响应的,时间间隔我已经设置了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 21:28:19 | 显示全部楼层
lyjlyj 发表于 2018-3-14 21:26
那些免费代理经常不响应的,时间间隔我已经设置了

免费的我感觉没什么用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 21:37:14 | 显示全部楼层
豆瓣有API的吧,好像是普通用户一分钟不超过40次请求还是多少来着
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-14 21:48:41 | 显示全部楼层
jfmlj 发表于 2018-3-14 21:37
豆瓣有API的吧,好像是普通用户一分钟不超过40次请求还是多少来着

我都是3到5秒发一次的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 22:18:02 | 显示全部楼层
lyjlyj 发表于 2018-3-14 20:40
为什么我使用使用模拟登录后,每次返回的代码都是一样的,我用的session.get发送,就得到了这样的结果


有些日子了。我有点忘了。。。。。
当时我这部分代码是这样的(不太好的版本,不能爬所有,会被封):
  1. # 书籍信息爬虫
  2. def book_spider(book_tag, cookies):
  3.         headers = {
  4.                 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3298.4 Safari/537.36'
  5.                 }
  6.         books_list = []
  7.         page_num = 0
  8.         url = 'https://book.douban.com/tag/' + urllib.parse.quote(book_tag) + '?start=' + str(page_num*20) + '&type=T'
  9.         res = requests.get(url, cookies=cookies, headers=headers)
  10.         soup = bs4.BeautifulSoup(res.text, 'html.parser')
  11.         # 找到一共有多少页
  12.         page_num_max = soup.find('div', attrs={'class': 'paginator'})
  13.         page_num_max = page_num_max.findAll('a')
  14.         page_num_max = page_num_max[-2].string.strip()
  15.         page_num_max = int(page_num_max)
  16.         while True:
  17.                 url = 'https://book.douban.com/tag/' + urllib.parse.quote(book_tag) + '?start=' + str(page_num*20) + '&type=T'
  18.                 res = requests.get(url, cookies=cookies, headers=headers)
  19.                 soup = bs4.BeautifulSoup(res.text, 'html.parser')
  20.                 # 找到该页所有书
  21.                 soup_list = soup.findAll('li', attrs={'class': 'subject-item'})
  22.                 for book_info in soup_list:
  23.                         # 书名
  24.                         title = book_info.find('a', attrs={'title': True})
  25.                         book_url = title.attrs['href']
  26.                         title = title.attrs['title']
  27.                         # 基本信息
  28.                         basic_info = book_info.find('div', attrs={'class': 'pub'}).string.strip()
  29.                         basic_info_list = basic_info.split('/')
  30.                         try:
  31.                                 author_info = '/'.join(basic_info_list[0: -3])
  32.                         except:
  33.                                 author_info = '暂无'
  34.                         try:
  35.                                 pub_info = '/'.join(basic_info_list[-3: ])
  36.                         except:
  37.                                 pub_info = '暂无'
  38.                         # 评价方面的数据
  39.                         evaluate_info = book_info.find('div', attrs={'class': 'star clearfix'})
  40.                         # 星级
  41.                         try:
  42.                                 allstar = evaluate_info.find('span', attrs={'class': True})
  43.                                 if (allstar.attrs['class'])[0][-1] == '1':
  44.                                         allstar = (allstar.attrs['class'])[0][-1]
  45.                                 else:
  46.                                         allstar = (allstar.attrs['class'])[0][-2] + '.' + (allstar.attrs['class'])[0][-1]
  47.                         except:
  48.                                 allstar = '0.0'
  49.                         # 评分
  50.                         try:
  51.                                 rating_nums = evaluate_info.find('span', attrs={'class': 'rating_nums'}).string.strip()
  52.                         except:
  53.                                 rating_nums = '0.0'
  54.                         # 评价人数
  55.                         try:
  56.                                 people_num = evaluate_info.find('span', attrs={'class': 'pl'}).string.strip()
  57.                                 people_num = people_num[1: -4]
  58.                         except:
  59.                                 people_num = '0'
  60.                         # 内容描述
  61.                         try:
  62.                                 description = book_info.find('p').string.strip()
  63.                         except:
  64.                                 description = '暂无'
  65.                         # 信息整理
  66.                         books_list.append([title, author_info, pub_info, allstar, rating_nums, people_num, description, book_url])
  67.                 print('第%d页信息采集完毕,共%d页' % (page_num+1, page_num_max))
  68.                 time.sleep(0.5)
  69.                 page_num += 1
  70.                 if page_num == page_num_max:
  71.                         break
  72.         return books_list
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-14 22:41:09 | 显示全部楼层
本帖最后由 lyjlyj 于 2018-3-14 22:43 编辑
Charles未晞 发表于 2018-3-14 22:18
有些日子了。我有点忘了。。。。。
当时我这部分代码是这样的(不太好的版本,不能爬所有,会被封): ...


你的cookies那里来的,是登录后,在浏览器中复制吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 22:42:54 | 显示全部楼层
lyjlyj 发表于 2018-3-14 22:41
你的cookies那里来的,是登录后,在浏览器中复制吗

是的。。。。。。
无痕模式登录。。。
多弄几个cookie
每次用不同的cookie
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 22:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表