鱼C论坛

 找回密码
 立即注册
查看: 2269|回复: 9

[已解决]求助:爬取百度新闻列表,由于最后一页不足20条,无法爬取出来,怎么办

[复制链接]
发表于 2017-11-30 19:45:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 李冬阳 于 2017-11-30 19:56 编辑

请各位大神帮帮忙!
写一个python爬虫按关键词抓取百度新闻列表,每页20条,但是最后一页通常不足20条,结果导致我写的程序无法对最后一页进行爬取。
程序如下:
  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,36):
  8.    
  9.     date=[]
  10.     media=[]
  11.     title=[]
  12.     link=[]
  13.     more_link=[]
  14.    
  15.     newsurl='http://news.baidu.com/ns?word=%28天山股份%2C新疆天山水泥股份有限公司%29&pn='+str((k-1)*20)+'&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1262275200&et=1451577599'

  16.     kv={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}
  17.     res=requests.get(newsurl,headers=kv)
  18.     res.encoding='utf-8'
  19.     soup=BeautifulSoup(res.text,'html.parser')
  20.     for i in range(20):
  21.         news=soup.find_all('div',{ 'class', 'result'})[i]
  22.    
  23.         h3=news.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
  24.         title.append(h3.text)
  25.    
  26.         m=news.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
  27.         m1=m.text.split()[0]
  28.         media.append(m1)
  29.                
  30.         t=m.text.split()[1]#取出每则新闻的发布时间
  31.         dt=datetime.strptime(t,'%Y年%m月%d日')
  32.         d=dt.strftime('%Y-%m-%d')
  33.         date.append(d)
  34.         
  35.         href=news.h3.a['href']
  36.         link.append(href)
  37.         
  38.         more=news.find( name= "a", attrs={ "class": re.compile( "c-more_link")})#取出更多相关新闻链接
  39.         if more != None:
  40.             more0=more['href']
  41.             more1="http://news.baidu.com"+more0
  42.             more_link.append(more1)
  43.         else:
  44.             more_link.append("None")
  45.         
  46.         data.append((date[i], title[i], media[i],more_link[i],link[i]))


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


  48. df=pandas.DataFrame(data)
  49. df.to_excel('000877天山股份.xlsx')
复制代码


提示的错误是:IndexError: list index out of range

最后一页的URL是:
http://news.baidu.com/ns?word=%28天山股份%2C新疆天山水泥股份有限公司%29&pn=680&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1262275200&et=1451577599
最后一页只有10条新闻

请大神们帮帮我,看看怎么解决这个问题,不胜感激!
最佳答案
2017-11-30 22:37:41
最后一页不足20条的问题我上次答过了呀
  1. news1=soup.find_all( 'div', class_='result')
  2. for i in news1:
  3.     提取标题
  4.     提取媒体
  5.     提取时间
复制代码

  1. for k in range(1,36):
  2.    
  3.     newsurl='http://news.baidu.com/ns?word=%28天山股份%2C新疆天山水泥股份有限公司%29&pn='+str((k-1)*20)+'&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1262275200&et=1451577599'

  4.     kv={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}
  5.     res=requests.get(newsurl,headers=kv)
  6.     res.encoding='utf-8'
  7.     soup=BeautifulSoup(res.text,'html.parser')
  8.     news1=soup.find_all( 'div', class_='result')
  9.     for i in news1:
  10.         h3=i.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
  11.         #title.append(h3.text)
  12.    
  13.         m=i.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
  14.         m1=m.text.split()[0]
  15.         #media.append(m1)
  16.                
  17.         t=m.text.split()[1]#取出每则新闻的发布时间
  18.         dt=datetime.strptime(t,'%Y年%m月%d日')
  19.         d=dt.strftime('%Y-%m-%d')
  20.         #date.append(d)
  21.         
  22.         href=i.h3.a['href']
  23.         #link.append(href)
  24.         
  25.         more=i.find( name= "a", attrs={ "class": re.compile( "c-more_link")})#取出更多相关新闻链接
  26.         if more != None:
  27.             more0=more['href']
  28.             more1="http://news.baidu.com"+more0
  29.             #more_link.append(more1)
  30.         else:
  31.             more1='None'
  32.             #more_link.append("None")
  33.         
  34.         data.append((d, h3.txt, more1,href))


  35.     print("第" + str(k) + "页完成")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-30 22:37:41 | 显示全部楼层    本楼为最佳答案   
最后一页不足20条的问题我上次答过了呀
  1. news1=soup.find_all( 'div', class_='result')
  2. for i in news1:
  3.     提取标题
  4.     提取媒体
  5.     提取时间
复制代码

  1. for k in range(1,36):
  2.    
  3.     newsurl='http://news.baidu.com/ns?word=%28天山股份%2C新疆天山水泥股份有限公司%29&pn='+str((k-1)*20)+'&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1262275200&et=1451577599'

  4.     kv={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}
  5.     res=requests.get(newsurl,headers=kv)
  6.     res.encoding='utf-8'
  7.     soup=BeautifulSoup(res.text,'html.parser')
  8.     news1=soup.find_all( 'div', class_='result')
  9.     for i in news1:
  10.         h3=i.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
  11.         #title.append(h3.text)
  12.    
  13.         m=i.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
  14.         m1=m.text.split()[0]
  15.         #media.append(m1)
  16.                
  17.         t=m.text.split()[1]#取出每则新闻的发布时间
  18.         dt=datetime.strptime(t,'%Y年%m月%d日')
  19.         d=dt.strftime('%Y-%m-%d')
  20.         #date.append(d)
  21.         
  22.         href=i.h3.a['href']
  23.         #link.append(href)
  24.         
  25.         more=i.find( name= "a", attrs={ "class": re.compile( "c-more_link")})#取出更多相关新闻链接
  26.         if more != None:
  27.             more0=more['href']
  28.             more1="http://news.baidu.com"+more0
  29.             #more_link.append(more1)
  30.         else:
  31.             more1='None'
  32.             #more_link.append("None")
  33.         
  34.         data.append((d, h3.txt, more1,href))


  35.     print("第" + str(k) + "页完成")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-30 23:46:39 | 显示全部楼层
chakyam 发表于 2017-11-30 22:37
最后一页不足20条的问题我上次答过了呀

我会用两段代码去做,先用一个py文件去抓取前面每页20条的新闻,然后用另外一个py文件抓取最后一页,就是感觉好麻烦,要添加两次URL,而且要去数最后一页有几条新闻。
可不可以用一个py文件搞定!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 00:06:50 From FishC Mobile | 显示全部楼层
我上面那个就可以了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 08:19:46 From FishC Mobile | 显示全部楼层
建议你学xpath定位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 10:34:41 | 显示全部楼层
css,xpath,re,lxml,bs4都可以帮助你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-1 12:26:03 | 显示全部楼层
chakyam 发表于 2017-12-1 00:06
我上面那个就可以了。。

之前粗心了,没认真看。
谢谢你,帮了我这么多!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-5 21:30:00 | 显示全部楼层

爬虫好像在下午4点爬取出问题,夜里11点又正常了。

本帖最后由 李冬阳 于 2017-12-5 23:38 编辑
chakyam 发表于 2017-11-30 22:37
最后一页不足20条的问题我上次答过了呀


老师,你好。
我在用之前你指导我的代码进行网络新闻抓取时,出现了一个问题,就是没办法全部抓取。比如下面的例子,网页上有277条新闻(13*20+17),最后只抓取了154条。
  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,15):
  8.    
  9.     newsurl="http://news.baidu.com/ns?word=%28云海金属%2C南京云海特种金属股份有限公司%29&pn="+str((k-1)*20)+"&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1136044800&et=1451577599"
  10.     kv={"User-Agent":"Mozilla/5.0"}
  11.     res=requests.get(newsurl,headers=kv)
  12.     res.encoding='utf-8'
  13.     soup=BeautifulSoup(res.text,'html.parser')
  14.     news1=soup.find_all('div', class_='result')
  15.     for i in news1:
  16.         h3=i.find( name= "a", attrs={ "target": re.compile( "_blank")})#取出每则新闻的标题
  17.    
  18.         m=i.find( name= "p", attrs={ "class": re.compile( "c-author")})#取出每则新闻的发布媒体
  19.         media=m.text.split()[0]
  20.                
  21.         t=m.text.split()[1]#取出每则新闻的发布时间
  22.         dt=datetime.strptime(t,'%Y年%m月%d日')
  23.         d=dt.strftime('%Y-%m-%d')

  24.         href=i.h3.a['href']

  25.         more=i.find( name= "a", attrs={"class":re.compile("c-more_link")})#取出更多相关新闻链接
  26.         if more != None:
  27.             more0=more['href']
  28.             more1="http://news.baidu.com"+more0
  29.         else:
  30.             more1='None'
  31.         
  32.         data.append((d, h3.text,media, more1,href))
  33.         
  34.     print("第" + str(k) + "页完成")


  35. df=pandas.DataFrame(data)
  36. df.to_excel('002182云海金属.xlsx')
复制代码


最后一页的URL为:http://news.baidu.com/ns?word=%28云海金属%2C南京云海特种金属股份有限公司%29&pn=260&cl=2&ct=1&tn=newsdy&rn=20&ie=utf-8&bt=1136044800&et=1451577599

请老师帮我看看,我也百思不得其解。
而且对于不能完整抓取的情况,程序也不会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-6 12:26:58 | 显示全部楼层
for k in range(1,15):
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-6 13:00:59 | 显示全部楼层
改进的话可以试试找到每一页新闻下一页这个按钮所指向的链接,最后一页没有下一页按钮,用try except捕捉AttributeError然后结束爬虫
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 23:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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