|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- import requests
- from lxml import etree
- class Tieba(object):
- def __init__(self,name):
- #1.url/headers
- self.url='https://tieba.baidu.com/f?ie=utf-8&kw={}&fr=search'.format(name)
- #headers
- 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'}
- def get_data(self,url):
- #request、返回网页源码
- response=requests.get(self.url,self.headers)
- return response.content
- def parse_data(self,data): #解析
- html=etree.HTML(data)
- 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')
- #print(len(el_list)) #看能出来几个结果 如果没有 则可能是语法 或者 浏览器高级渲染把源代码注释了,换个低级headers
- # 或者网页中 用此格式做标注 < !-- 引入百度统计 --> ,可以用空格替换掉 data=data.decode().replace('< !--','').replace('-->','')
- data_list=[] #title+link的列表
- for el in el_list: #el 是 html的子项 也属于elment 也可以用xpath语法
- title_link={}
- title_link['title']=el.xpath('./text()')[0]
- title_link['link']='http://tieba.baidu.com' + el.xpath('./@href')[0]
- data_list.append(title_link)
- #一页操作完成,接着下一页 找下一页是相对的,不同页索引不一样
- try:
- next_url='https:'+html.xpath('//a[contains(text(),"下一页")]/@href')[0] #最后一页没有下一页标签 会报错
- except: #//a[@class ="next pagination-item"]/@href 这里用这个语法 网页中可以,但py中显示不出下一页的链接
- next_url =None
- return data_list,next_url
- def save_data(self,data_list):
- for data in data_list:
- print(data)
- def run(self):
- next_url=self.url
- while True:
- data = self.get_data(next_url) #第一次的下一页链接从首页获取,
- data_list,next_url=self.parse_data(data) #后面的下一页链接从解析出来的当前页面获取
- # 提取 (数据和翻页的url)
- self.save_data(data_list)
- print(next_url)
- if next_url ==None:
- break
- if __name__ == '__main__':
- tieba=Tieba('李毅')
- tieba.run()
复制代码 |
|