鱼C论坛

 找回密码
 立即注册
查看: 1370|回复: 2

百度贴吧爬虫实例,一直在第一页循环不能翻页,循环体哪里有问题呢?

[复制链接]
发表于 2021-9-7 19:45:58 | 显示全部楼层 |阅读模式

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

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

x
  1. import requests
  2. from lxml import etree

  3. class Tieba(object):
  4.     def __init__(self,name):
  5.         #1.url/headers
  6.         self.url='https://tieba.baidu.com/f?ie=utf-8&kw={}&fr=search'.format(name)
  7.         #headers
  8.         self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}

  9.     def get_data(self,url):
  10.         #request、返回网页源码
  11.         response=requests.get(self.url,self.headers)
  12.         return response.content

  13.     def parse_data(self,data): #解析
  14.         html=etree.HTML(data)

  15.         el_list=html.xpath('//*[@id="thread_list"]/li/div/div[2]/div[1]/div[1]/a|//*[@id="thread_top_list"]/li/div/div[2]/div/div[1]/a')
  16.         #print(len(el_list))  #看能出来几个结果   如果没有 则可能是语法 或者 浏览器高级渲染把源代码注释了,换个低级headers
  17.         #    或者网页中 用此格式做标注  < !-- 引入百度统计 -->  ,可以用空格替换掉   data=data.decode().replace('< !--','').replace('-->','')
  18.         data_list=[]  #title+link的列表
  19.         for el in el_list:   #el 是 html的子项 也属于elment 也可以用xpath语法
  20.             title_link={}
  21.             title_link['title']=el.xpath('./text()')[0]
  22.             title_link['link']='http://tieba.baidu.com' + el.xpath('./@href')[0]
  23.             data_list.append(title_link)
  24.         #一页操作完成,接着下一页  找下一页是相对的,不同页索引不一样
  25.         try:
  26.             next_url='https:'+html.xpath('//a[contains(text(),"下一页")]/@href')[0]  #最后一页没有下一页标签 会报错
  27.         except:         #//a[@class ="next pagination-item"]/@href    这里用这个语法 网页中可以,但py中显示不出下一页的链接
  28.             next_url =None
  29.         return data_list,next_url

  30.     def save_data(self,data_list):
  31.         for data in data_list:
  32.             print(data)

  33.     def run(self):
  34.         next_url=self.url
  35.         while True:
  36.             data = self.get_data(next_url)             #第一次的下一页链接从首页获取,
  37.             data_list,next_url=self.parse_data(data)   #后面的下一页链接从解析出来的当前页面获取
  38.             # 提取 (数据和翻页的url)
  39.             self.save_data(data_list)
  40.             print(next_url)
  41.             if next_url ==None:
  42.                 break

  43. if __name__ == '__main__':
  44.     tieba=Tieba('李毅')
  45.     tieba.run()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-11 20:35:44 | 显示全部楼层
  1. import requests
  2. from lxml import etree


  3. class Tieba():
  4.     def __init__(self, name):
  5.         self.name = name
  6.         self.base_url = 'https://tieba.baidu.com/'
  7.         self.headers = {'user-agent': 'Mozilla', 'host': 'tieba.baidu.com'}

  8.     def run(self):
  9.         num = int(input('Please enter the number of pages you want to download: '))
  10.         for x in range(num):
  11.             url = f'https://tieba.baidu.com/f?ie=utf-8&kw={self.name}&pn={x * 50}'
  12.             r = requests.get(url, headers=self.headers)
  13.             html = etree.HTML(r.text)
  14.             tits = html.xpath('//a[@class="j_th_tit "]/@title')
  15.             hrefs = html.xpath('//a[@class="j_th_tit "]/@href')
  16.             print(f'第{x + 1}页标题和链接:')
  17.             for k, v in zip(tits, hrefs):
  18.                 print(k, f'{self.base_url}{v}')
  19.             print('=' * 100)


  20. if __name__ == '__main__':
  21.     t = Tieba('李毅')
  22.     t.run()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-12 10:35:29 | 显示全部楼层

感谢
我最后把 next_url=  删了,在下面加了 self.url=next_url  就好了

不过我想了几天还是没想通 抄的  教程里的  run() 究竟错在哪了  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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