李冬阳 发表于 2017-11-10 17:00:05

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

求大神给个指点!!!
问题:现在在百度新闻网站中,按关键字搜索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'})
   
      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()
      media.append(m1)
               
      t=m.text.split()#取出每则新闻的发布时间
      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, title, media,link))

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

执行的结果就是将新闻列表第一页重复27次。
求大神指点,该如何解决这个问题。

chakyam 发表于 2017-11-10 20:06:20

date=[]
media=[]
title=[]
link=[]
写进第一个for里

李冬阳 发表于 2017-11-10 20:24:30

chakyam 发表于 2017-11-10 20:06
date=[]
media=[]
title=[]


大神,太感谢了!{:5_92:}
我今天掰扯半天也你没弄好。大神看一眼就帮我把问题解决了。

chakyam 发表于 2017-11-10 20:25:46

李冬阳 发表于 2017-11-10 20:24
大神,太感谢了!
我今天掰扯半天也你没弄好。大神看一眼就帮我把问题解决了。

并不是大神,也不止看了一眼,遇到问题打几个print看看出来的东西和你想要的有没有出入就知道问题在哪了

chunboh 发表于 2017-11-12 17:49:02

我导入BeautifulSoup时出错,求支招解决。

李冬阳 发表于 2017-11-12 20:48:27

chunboh 发表于 2017-11-12 17:49
我导入BeautifulSoup时出错,求支招解决。

pip install BeautifulSoup4
你少了一个4{:5_91:}

李冬阳 发表于 2017-11-14 21:29:24

chakyam 发表于 2017-11-10 20:06
date=[]
media=[]
title=[]


你好,我又遇到一些问题,求指导{:5_92:}
当我运行下列代码import requests
from bs4 import BeautifulSoup
from datetime import datetime
import pandas
import re



data=[]

for k in range(1,33):
   
    date=[]
    media=[]
    title=[]
    link=[]
    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)
    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'})
   
      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()
      media.append(m1)
               
      t=m.text.split()#取出每则新闻的发布时间
      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, title, media,link))




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

df=pandas.DataFrame(data)
df.to_excel('000016深康佳.xlsx')

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

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

data=[]

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

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'
   
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(14):
    news=soup.find_all( 'div', { 'class', 'result'})
   
    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()
    media.append(m1)
               
    t=m.text.split()#取出每则新闻的发布时间
    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, title, media,link))
   
df=pandas.DataFrame(data)
df.to_excel('000016(23).xlsx')

但是抓取不全,20条新闻,只抓取了14条。
求大神帮忙答疑解惑。{:5_92:}{:5_92:}

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,算了你自己看吧{:10_266:}

李冬阳 发表于 2017-11-14 23:31:01

chakyam 发表于 2017-11-14 22:08
第一段代码,运行到报错时,
>>> newsurl
'http://news.baidu.com/ns?word=深康佳,康佳集团股份有限公 ...

谢谢!
搞定了。将newsurl换一种方式进行格式化
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条新闻的,就没办法抓取了。只能使用抓取单页新闻列表的方式抓取{:5_91:}

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:
    提取标题
    提取媒体
    提取时间

李冬阳 发表于 2017-11-17 09:31:03

chakyam 发表于 2017-11-15 00:11
其实问题的原因不在于怎么格式化,而是那个第一段代码里的链接你用的关键词是深康佳,康佳集团股份有限 ...

大神,我又来请教你了。{:5_92:}{:5_92:}
我的抓取百度新闻列表的程序今早突然不能抓取了。一直提示错误
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
程序如下:
import requests
from bs4 import BeautifulSoup
from datetime import datetime
import pandas
import re


data=[]

for k in range(1,26):
   
    date=[]
    media=[]
    title=[]
    link=[]
   
    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'

   
    res=requests.get(newsurl)
    res.encoding='utf-8'
    soup=BeautifulSoup(res.text,'html.parser')
    for i in range(20):
      news=soup.find_all('div',{ 'class', 'result'})
   
      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()
      media.append(m1)
               
      t=m.text.split()#取出每则新闻的发布时间
      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, title, media,link))


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


df=pandas.DataFrame(data)
df.to_excel('000565渝三峡A.xlsx')

是不是百度新闻不让爬虫上午爬取网站啊?
或者因为昨天爬取30家企业的新闻,导致我的ip被禁了?
太恐怖了!
求大神帮忙看看怎么办{:5_100:}{:5_100:}

chakyam 发表于 2017-11-17 23:15:56

李冬阳 发表于 2017-11-17 09:31
大神,我又来请教你了。
我的抓取百度新闻列表的程序今早突然不能抓取了。一直提示错误 ...

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

李冬阳 发表于 2017-11-30 19:51:03

chakyam 发表于 2017-11-10 20:06
date=[]
media=[]
title=[]


大神,你好,我碰到一个问题,就是抓取百度新闻列表时,最后一页不足20条,无法抓取。
我发了一个新的求助帖,链接如下:
http://bbs.fishc.com/thread-100609-1-1.html
请大神帮帮忙!{:5_92:}
页: [1]
查看完整版本: 写了一个抓取百度新闻列表的爬虫,为啥只能抓取第一页,然后不停重复