爬取百度热搜小说名、作者、类型(xpath)
文章介绍了使用Python爬取百度小说排行榜的基本流程:1)通过requests.get()发送请求并设置User-Agent伪装头;2)使用etree.HTML解析网页;3)通过xpath定位目标元素,其中小说名直接获取,作者和类型因标签相同需用双层循环处理;4)用text()方法提取内容。文中强调xpath定位需借助浏览器开发者工具(F12),并建议初学者先掌握一种解析方法。


代码就是这个代码,依旧是发送请求,获得响应,解析网页(用xpath解析),定位目标位置(用xpath方法),获取信息,打印信息。虽然简陋了一点,但不影响现在学习。
一、发送请求、获得响应
就是python解释器模仿浏览器向服务端发送请求,这样想好理解一点,就是下面这句
response = requests.get(url, headers=headers)
那你发送请求,总代有个目标,也就是向哪个网址(服务器)发送请求,所以需要一个网址,就是下面这句
url = "https://top.baidu.com/board?tab=novel"
OK,你模仿浏览器,为了防止被服务器识别出来,你现在需要伪装一下,给自己的头换个脸防止被服务器认出来,不给你访问(就比如你和你哥张着相同的脸,所以你嫂子才会给你开门),就是下面这句
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36"
}
这个伪装头这么长,记不住咋办,这个不用记,会用抓包工具(F12)就行,这个抓包工具就是电脑自带的一个功能非常的简单
二、解析网页
解析网页这个听着就很难,其实不然,都是固定格式,就类似下面这种的解析
html = etree.HTML(response.text)
为啥说是“类似”因为现在用的是etree方法解析网页,当然又其他方法解析网页比如说:BeautifulSoup方法、pyquery方法等都可以解析,如果觉得头大,可以先精通一种,然后再学习其他的
三、定位目标位置
定位目标位置需要用到抓包工具F12,当然鼠标右键选择检查也行,这次我们爬取小说名、作者和类型,总需要找到其在网页中的位置吧就是下面这两句
小说名(定位(//div[@class='c-single-text-ellipsis']/)后顺便获取小说名(text()))
novel_names = html.xpath("//div[@class='c-single-text-ellipsis']/text()")
作者、类型
xpath = f"/html/body/div[1]/div/main/div[2]/div/div[2]/div[{i}]/div/div[{j}]"
这时候就有老铁问了,为什么定位小说名一行代码,而定位作者和类型也只需要一行代码,按理来说不应该是两行吗?
直接说,因为作者和类型的标签和属性一样(如下图),如果按照获取小说名的方式来获取作者和类
![]()
型会冲突,有时获取不到作者有时又获取不到类型,所以通过构建xpath路径和两层for循环来获取
四、获取信息
获取小说名,上面就说过了,就是通过
novel_names = html.xpath("//div[@class='c-single-text-ellipsis']/text()")
这句代码的最后text()就是获取内容的,results = html.xpath(xpath),这句话有必要说一下,通过xpath方法后获得的results是只有一个元素的列表,然后通过text方法(text = results[0].text)获得内容,是作者就加到作者列表,不是作者就是类型,就加到类型列表
至于说双层for循环不会的,可以看看相应的视频
五、打印信息
打印信息,可以直接在运行窗口查看,或者以文件的形式保存后查看,这里就在运行窗户查看
OK,解释一下面这句
for index, name in enumerate(novel_names, start=1):
就是一个for循环,中间用了enumerate函数,作用就是给前面加一个序号,本序号是从0开始,这里我们默认从1开始,好的,现在解释一下,下面两句
writer = writers[index - 1].strip() type_ = types[index - 1].strip()
为什么要-1,因为列表是从索引是从0开始的,而index是从1开始的,所以减一,然后输出
print(f"{index}. {name.strip()} {writer} {type_}")
更多推荐



所有评论(0)