QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

新鱼友

Rank: 1

积分
25
查看: 195|回复: 11

[已解决]写了一个抓取百度新闻列表的爬虫,为啥只能抓取第一页,然后不停重复

[复制链接]
最佳答案
0 
累计签到:33 天
连续签到:2 天
李冬阳 发表于 2017-11-10 17:00:05 19511 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
求大神给个指点!!!
问题:现在在百度新闻网站中,按关键字搜索2011.1.1至2015.12.31的新闻列表,一共27页。抓取新闻的标题、时间、媒体来源和新闻的链接。代码如下:
import requests
from bs4 import BeautifulSoup
from datetime import datetime
import pandas
import re


data=[]
date=[]
media=[]
title=[]
link=[]

for k in range(1,28):
    newsurl='http://news.baidu.com/ns?word=南玻集团, 南玻A, 中国南玻集团股份有限公司&pn=%s&cl=2&ct=0&tn=news&rn=20&ie=utf-8&bt=1293811200&et=1451577599'%((k-1)*20)
   
    kv={"User-Agent":"Mozilla/5.0 "}
    res=requests.get(newsurl,headers=kv)
    res.encoding='utf-8'
    soup=BeautifulSoup(res.text,'html.parser')
    for i in range(20):
        news=soup.find_all( 'div', { 'class', 'result'})[i]
   
        h3=news.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
        title.append(h3.text)
   
        m=news.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
        m1=m.text.split()[0]
        media.append(m1)
               
        t=m.text.split()[1]#取出每则新闻的发布时间
        dt=datetime.strptime(t,'%Y年%m月%d日')
        d=dt.strftime('%Y-%m-%d')
        date.append(d)
        
        href=news.h3.a['href']
        link.append(href)
        
        data.append((date[i], title[i], media[i],link[i]))

    print("第" + str(k) + "页完成")
df=pandas.DataFrame(data)
df.to_excel('news.xlsx')

执行的结果就是将新闻列表第一页重复27次。
求大神指点,该如何解决这个问题。
最佳答案
2017-11-10 20:06:20
date=[]
media=[]
title=[]
link=[]
写进第一个for里
楼层
跳转到指定楼层
最佳答案
16 
累计签到:4 天
连续签到:1 天
chakyam 发表于 2017-11-10 20:06:20 | 显示全部楼层    本楼为最佳答案   
date=[]
media=[]
title=[]
link=[]
写进第一个for里
最佳答案
0 
累计签到:33 天
连续签到:2 天
李冬阳  楼主| 发表于 2017-11-10 20:24:30 | 显示全部楼层
chakyam 发表于 2017-11-10 20:06
date=[]
media=[]
title=[]

大神,太感谢了!
我今天掰扯半天也你没弄好。大神看一眼就帮我把问题解决了。
最佳答案
16 
累计签到:4 天
连续签到:1 天
chakyam 发表于 2017-11-10 20:25:46 | 显示全部楼层
李冬阳 发表于 2017-11-10 20:24
大神,太感谢了!
我今天掰扯半天也你没弄好。大神看一眼就帮我把问题解决了。

并不是大神,也不止看了一眼,遇到问题打几个print看看出来的东西和你想要的有没有出入就知道问题在哪了
最佳答案
0 
累计签到:1 天
连续签到:1 天
chunboh 发表于 2017-11-12 17:49:02 | 显示全部楼层
我导入BeautifulSoup时出错,求支招解决。
Capture.PNG
最佳答案
0 
累计签到:33 天
连续签到:2 天
李冬阳  楼主| 发表于 2017-11-12 20:48:27 | 显示全部楼层
chunboh 发表于 2017-11-12 17:49
我导入BeautifulSoup时出错,求支招解决。

pip install BeautifulSoup4
你少了一个4
最佳答案
0 
累计签到:33 天
连续签到:2 天
李冬阳  楼主| 发表于 2017-11-14 21:29:24 | 显示全部楼层
chakyam 发表于 2017-11-10 20:06
date=[]
media=[]
title=[]

你好,我又遇到一些问题,求指导
当我运行下列代码
  1. import requests
  2. from bs4 import BeautifulSoup
  3. from datetime import datetime
  4. import pandas
  5. import re



  6. data=[]

  7. for k in range(1,33):
  8.    
  9.     date=[]
  10.     media=[]
  11.     title=[]
  12.     link=[]
  13.     newsurl='http://news.baidu.com/ns?word=深康佳,康佳集团股份有限公司,康佳集团&pn=%s&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1293811200&et=1451577599'%((k-1)*20)
  14.     kv={"User-Agent":"Mozilla/5.0 "}
  15.     res=requests.get(newsurl,headers=kv)
  16.     res.encoding='utf-8'
  17.     soup=BeautifulSoup(res.text,'html.parser')
  18.     for i in range(20):
  19.         news=soup.find_all( 'div', { 'class', 'result'})[i]
  20.    
  21.         h3=news.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
  22.         title.append(h3.text)
  23.    
  24.         m=news.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
  25.         m1=m.text.split()[0]
  26.         media.append(m1)
  27.                
  28.         t=m.text.split()[1]#取出每则新闻的发布时间
  29.         dt=datetime.strptime(t,'%Y年%m月%d日')
  30.         d=dt.strftime('%Y-%m-%d')
  31.         date.append(d)
  32.         
  33.         href=news.h3.a['href']
  34.         link.append(href)
  35.         
  36.         data.append((date[i], title[i], media[i],link[i]))




  37.     print("第" + str(k) + "页完成")
  38.   
  39. df=pandas.DataFrame(data)
  40. df.to_excel('000016深康佳.xlsx')
复制代码


最后总是抓取到第22页,就不往下抓取了,提示:
    news=soup.find_all( 'div', { 'class', 'result'})
IndexError: list index out of range

然后我猜想23页有问题,检查元素,也没发现特别之处。就用下列代码单独抓取23页
  1. import requests
  2. from bs4 import BeautifulSoup
  3. from datetime import datetime
  4. import pandas
  5. import re

  6. data=[]

  7. date=[]
  8. media=[]
  9. title=[]
  10. link=[]

  11. newsurl='http://news.baidu.com/ns?word=深康佳A,康佳集团股份有限公司,康佳集团&pn=440&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1293811200&et=1451577599'
  12.    
  13. kv={"User-Agent":"Mozilla/5.0 "}
  14. res=requests.get(newsurl,headers=kv)
  15. res.encoding='utf-8'
  16. soup=BeautifulSoup(res.text,'html.parser')
  17. for i in range(14):
  18.     news=soup.find_all( 'div', { 'class', 'result'})[i]
  19.    
  20.     h3=news.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
  21.     title.append(h3.text)
  22.    
  23.     m=news.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
  24.     m1=m.text.split()[0]
  25.     media.append(m1)
  26.                
  27.     t=m.text.split()[1]#取出每则新闻的发布时间
  28.     dt=datetime.strptime(t,'%Y年%m月%d日')
  29.     d=dt.strftime('%Y-%m-%d')
  30.     date.append(d)
  31.         
  32.     href=news.h3.a['href']
  33.     link.append(href)
  34.         
  35.     data.append((date[i], title[i], media[i],link[i]))
  36.    
  37. df=pandas.DataFrame(data)
  38. df.to_excel('000016(23).xlsx')
复制代码


但是抓取不全,20条新闻,只抓取了14条。
求大神帮忙答疑解惑。
最佳答案
16 
累计签到:4 天
连续签到:1 天
chakyam 发表于 2017-11-14 22:08:13 | 显示全部楼层

第一段代码,运行到报错时,
>>> newsurl
'http://news.baidu.com/ns?word=深康佳,康佳集团股份有限公司,康佳集团&pn=440&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1293811200&et=1451577599'

将上面网址粘贴到浏览器访问一下你就知道了

而第二段代码的newsurl,算了你自己看吧
最佳答案
0 
累计签到:33 天
连续签到:2 天
李冬阳  楼主| 发表于 2017-11-14 23:31:01 | 显示全部楼层
chakyam 发表于 2017-11-14 22:08
第一段代码,运行到报错时,
>>> newsurl
'http://news.baidu.com/ns?word=深康佳,康佳集团股份有限公 ...

谢谢!
搞定了。将newsurl换一种方式进行格式化
  1. newsurl='http://news.baidu.com/ns?word=%28%E6%B7%B1%E5%BA%B7%E4%BD%B3A%2C%E5%BA%B7%E4%BD%B3%E9%9B%86%E5%9B%A2%E8%82%A1%E4%BB%BD%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%2C%E5%BA%B7%E4%BD%B3%E9%9B%86%E5%9B%A2%29&pn='+str((k-1)*20)+'&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1293811200&et=1451577599'
复制代码

这样就行了。
不过最后一页,不够20条新闻的,就没办法抓取了。只能使用抓取单页新闻列表的方式抓取
最佳答案
16 
累计签到:4 天
连续签到:1 天
chakyam 发表于 2017-11-15 00:11:38 | 显示全部楼层
李冬阳 发表于 2017-11-14 23:31
谢谢!
搞定了。将newsurl换一种方式进行格式化


其实问题的原因不在于怎么格式化,而是那个第一段代码里的链接你用的关键词是深康佳,康佳集团股份有限公司,康佳集团,而第二段代码里的链接你用的关键词是深康佳A,康佳集团股份有限公司,康佳集团,在debug的时候你误用了第二个链接导致你以为结果有24页甚至更多(实际上只到23页,而且第23页不够20条)

至于最后一页结果不够20的解决方法,你可以试试
news1=soup.find_all( 'div', class_='result')
for i in news1:
    提取标题
    提取媒体
    提取时间
最佳答案
0 
累计签到:33 天
连续签到:2 天
李冬阳  楼主| 发表于 2017-11-17 09:31:03 | 显示全部楼层
chakyam 发表于 2017-11-15 00:11
其实问题的原因不在于怎么格式化,而是那个第一段代码里的链接你用的关键词是深康佳,康佳集团股份有限 ...

大神,我又来请教你了。
我的抓取百度新闻列表的程序今早突然不能抓取了。一直提示错误
Traceback (most recent call last):
  File "C:\Python\按关键字爬取百度新闻列表(最终版).py", line 24, in <module>
    news=soup.find_all('div',{ 'class', 'result'})
IndexError: list index out of range
程序如下:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. from datetime import datetime
  4. import pandas
  5. import re


  6. data=[]

  7. for k in range(1,26):
  8.    
  9.     date=[]
  10.     media=[]
  11.     title=[]
  12.     link=[]
  13.    
  14.     newsurl='http://news.baidu.com/ns?word=%28渝三峡A%2C重庆三峡油漆股份有限公司%29&pn='+str((k-1)*20)+'&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1262275200&et=1451577599'

  15.    
  16.     res=requests.get(newsurl)
  17.     res.encoding='utf-8'
  18.     soup=BeautifulSoup(res.text,'html.parser')
  19.     for i in range(20):
  20.         news=soup.find_all('div',{ 'class', 'result'})[i]
  21.    
  22.         h3=news.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
  23.         title.append(h3.text)
  24.    
  25.         m=news.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
  26.         m1=m.text.split()[0]
  27.         media.append(m1)
  28.                
  29.         t=m.text.split()[1]#取出每则新闻的发布时间
  30.         dt=datetime.strptime(t,'%Y年%m月%d日')
  31.         d=dt.strftime('%Y-%m-%d')
  32.         date.append(d)
  33.         
  34.         href=news.h3.a['href']
  35.         link.append(href)
  36.         
  37.         data.append((date[i], title[i], media[i],link[i]))


  38.     print("第" + str(k) + "页完成")


  39. df=pandas.DataFrame(data)
  40. df.to_excel('000565渝三峡A.xlsx')
复制代码


是不是百度新闻不让爬虫上午爬取网站啊?
或者因为昨天爬取30家企业的新闻,导致我的ip被禁了?
太恐怖了!
求大神帮忙看看怎么办
最佳答案
16 
累计签到:4 天
连续签到:1 天
chakyam 发表于 2017-11-17 23:15:56 | 显示全部楼层
李冬阳 发表于 2017-11-17 09:31
大神,我又来请教你了。
我的抓取百度新闻列表的程序今早突然不能抓取了。一直提示错误 ...

应该是你网络问题,我这不能复现你的问题,另外从报错原因来看不像是被禁ip

pythonw_2017-11-17_23-15-15.png

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-25 19:13

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