鱼C论坛

 找回密码
 立即注册
查看: 1858|回复: 1

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

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

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

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

x
求大神给个指点!!!小女子先谢谢了!!
问题:现在在百度新闻网站中,按关键字搜索2011.1.1至2015.12.31的新闻列表,一共27页。抓取新闻的标题、时间、媒体来源和新闻的链接。代码如下:
  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. for k in range(1,28):
  12.     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)
  13.    
  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('news.xlsx')
复制代码


执行的结果就是将新闻列表第一页重复27次。
求大神指点,该如何解决这个问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-11-11 15:04:54 | 显示全部楼层
其实你用ide调试一下看看各个变量的值就会发现问题所在了

下面这一堆的初始化是在大循环之前的,且后面没有在初始化过。
  1. data=[]
  2. date=[]
  3. media=[]
  4. title=[]
  5. link=[]
复制代码


这一堆变量的更改都是直接在后面添加新值的
  1. title.append(h3.text)
复制代码


问题就出现在了下面这行代码这里,i是在小循环里面的,只会取值1~20,也就是一直会把“第一页”的各种信息循环添加到data中
  1. data.append((date[i], title[i], media[i],link[i]))
复制代码


把它改成下面这样,或者在大循环开始的时候把那一堆变量都重新设为空
  1. data.append((date[(k-1)*20+i], .....))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-18 03:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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