这个爬虫程序主要是爬取贴吧帖子的title和url,如果需要爬内容只需要修改部分代码就行
我使用的技术是python和xpath
思路:
- 获取主URL
- 获取数据
- 提取数据,进行解析
- 获取下一页的url
- 终止循环
代码:
import requests
from lxml import etree
class PaChong(object):
"""爬百度贴吧"""
def __init__(self, name):
self.url = 'https://tieba.baidu.com/f?ie=utf-8&kw={}&fr=search'.format(name)
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
# 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'Referer': 'https://tieba.baidu.com/f?ie=utf-8&kw=kenshi&fr=search'
}
def get_data(self, url):
response = requests.get(url)
return response.content
def parse_data(self, data):
data = data.decode().replace('<!--', '').replace('-->', '')
html = etree.HTML(data)
el_list = html.xpath('//li[@class=" j_thread_list clearfix"]/div/div[2]/div[1]/div[1]/a')
data_list = []
for i in el_list():
temp = {
'title': i.xpath('./text()')[0]
'url': 'https://tieba.baidu.com' + i.xpath('./@href')[0]
}
data_list.append(temp)
try:
next_url = 'https:' + html.xpath("//a[contains(text(), '下一页')]/@href")[0]
except:
next_url = None
return data_list, next_url
def save_data(self, data_list):
with open('aaa.text', 'w', encoding='utf-8') as f:
f.with(str(data_list))
def run(self):
next_url = self.url
while True:
data = self.get_data(next_url)
data_list, next_url = self.parse_data(data)
self.save_data(data_list)
if next_url == None:
break
if __name__ == '__main__':
pa = PaChong('kenshi')
pa.run()
讲一下部分代码结构
首先请求头,一般使用的浏览器都是谷歌,但是不排除一些比较low的浏览器去访问贴吧,所以贴吧将源码进行注释,谷歌浏览器可以进行解析,但是一般的浏览器不能解析,也就意味着获取不到数据
两种解决方案:
- 使用低版本的请求头,如:代码中注释的那个
- 还使用高版本的请求头,但是在解析获取到的数据是,需要将注释的代码替换
链接,也就是url,因为获取到的url不全,需要进行拼接后再返回
循环终止,下一页的url获取不到,意味着循环结束