写了一个抓取百度新闻列表的爬虫,为啥只能抓取第一页,然后不停重复
求大神给个指点!!!问题:现在在百度新闻网站中,按关键字搜索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次。
求大神指点,该如何解决这个问题。 date=[]
media=[]
title=[]
link=[]
写进第一个for里 chakyam 发表于 2017-11-10 20:06
date=[]
media=[]
title=[]
大神,太感谢了!{:5_92:}
我今天掰扯半天也你没弄好。大神看一眼就帮我把问题解决了。 李冬阳 发表于 2017-11-10 20:24
大神,太感谢了!
我今天掰扯半天也你没弄好。大神看一眼就帮我把问题解决了。
并不是大神,也不止看了一眼,遇到问题打几个print看看出来的东西和你想要的有没有出入就知道问题在哪了 我导入BeautifulSoup时出错,求支招解决。 chunboh 发表于 2017-11-12 17:49
我导入BeautifulSoup时出错,求支招解决。
pip install BeautifulSoup4
你少了一个4{:5_91:} 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:}
第一段代码,运行到报错时,
>>> 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:}
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:} 李冬阳 发表于 2017-11-14 23:31
谢谢!
搞定了。将newsurl换一种方式进行格式化
其实问题的原因不在于怎么格式化,而是那个第一段代码里的链接你用的关键词是深康佳,康佳集团股份有限公司,康佳集团,而第二段代码里的链接你用的关键词是深康佳A,康佳集团股份有限公司,康佳集团,在debug的时候你误用了第二个链接导致你以为结果有24页甚至更多(实际上只到23页,而且第23页不够20条)
至于最后一页结果不够20的解决方法,你可以试试
news1=soup.find_all( 'div', class_='result')
for i in news1:
提取标题
提取媒体
提取时间 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:}
李冬阳 发表于 2017-11-17 09:31
大神,我又来请教你了。
我的抓取百度新闻列表的程序今早突然不能抓取了。一直提示错误 ...
应该是你网络问题,我这不能复现你的问题,另外从报错原因来看不像是被禁ip
chakyam 发表于 2017-11-10 20:06
date=[]
media=[]
title=[]
大神,你好,我碰到一个问题,就是抓取百度新闻列表时,最后一页不足20条,无法抓取。
我发了一个新的求助帖,链接如下:
http://bbs.fishc.com/thread-100609-1-1.html
请大神帮帮忙!{:5_92:}
页:
[1]