Python爬虫之获取小说

学这个之前请确保自己对http协议和html有些了解(不用全都会)

爬虫是什么?

爬虫就是模拟浏览器去访问链接,来帮助我们获取想要的数据,可见即可爬(爬不到就是技术不够)

浏览器是怎样访问网页的呢?

浏览器会向一个网站发起一个请求,网站再作出响应,返回数据给浏览器,返回的数据就包含我们想要的东西。

不多哔哔,进入正文!

就拿起点中文网为例,推荐使用Chrome浏览器,因为火狐一次次让我失望。

 

 

是不是很多小说?(虽然我一个也不看,全是一群妄想家的白日梦,已经无药可救   (艹皿艹 ))

点进第一本的目录里看看:

 

如果想把每一章的内容都保存下来的话,这他娘的也太多了吧,这搁谁谁受得了啊。。。。w(゚Д゚)w

桥豆麻袋!!!!我们还有爬虫!管他有多少章节都得乖乖躺在朕的硬盘里︿( ̄︶ ̄)︿

第一步:获取书名的链接,按下F12键,鼠标定位到书名

 

每个书名都有对应的链接,我们需要拿到它,代码里会出现

Bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
Bigsrc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')

这个xpath超好用,不用我们写正则表达式啦! (づ ̄3 ̄)づ╭❤~

 第一行用于获取class="book-mid-info"这个div控件下的h4标签下的a标签的文本值

 第二行用于获取class="book-mid-info"这个div控件下的h4标签下的a标签的链接值

 接下来出现的类似代码也是类似的功能

 第二步:拿到书名和链接,我们访问这个链接,就会到书的章节目录里面去,再按F12

 

 

 第三步:访问每一个章节链接把每一章的内容保存下来

每一章的章节名也会有文本和链接,拿到每一章的链接就能看到每一章里面的内容了

 

 

 

思路有了,代码怎么写呢?需要以下三个模块

requests(发起请求)
os(文件管理)
lxml 的 etree(处理页面响应的html)

翠花,上代码!

import requests
import os
from lxml import etree
class Spider(object):#面向对象式编程
    def start_request(self):#拿到小说名
        response=requests.get("https://www.qidian.com/all")#发起请求访问链接
        html=etree.HTML(response.text)#将HTML代码处理成树状结构
        Bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
        Bigsrc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')
        for Bigtit,Bigsrc in zip(Bigtit_list,Bigsrc_list):#遍历所有书名和链接
            if os.path.exists(Bigtit)==False:
                os.mkdir(Bigtit)#创建书名文件夹
            self.file_data(Bigtit,Bigsrc)
    def file_data(self,Bigtit,Bigsrc):#访问书名链接获取章节
        url="http:"+Bigsrc;
        response=requests.get(url)
        print(url)
        html=etree.HTML(response.text)
        Littit_list=html.xpath('//ul[@class="cf"]/li/a/text()')
        Litsrc_list = html.xpath('//ul[@class="cf"]/li/a/@href')
        for Littit, Litsrc in zip(Littit_list, Litsrc_list):#遍历所有章节
           self.file_save(Littit,Litsrc,Bigtit)
    def file_save(self,Littit,Litsrc,Big_tit):#访问章节内容并保存
        response=requests.get("http:"+Litsrc)
        html=etree.HTML(response.text)
        content="\n".join(html.xpath('//div[@class="read-content j_readContent"]/p/text()'))
        file_name=Big_tit+"\\"+Littit+".txt"
        print(file_name)
        with open(file_name,"a",encoding="utf-8") as f:#保存章节内容
            f.write(content)

s=Spider()
s.start_request()

代码到此就没有了,也不长,但是初学的时候确实不知道怎么弄,还掰着正则表达式看了一通,不知道原来xpath这么香。

小说这么干就能干完了,想获取其他的文本也是类似的,但是网站的反爬虫机制可能会导致失败,我这个没有加request 的请求头,加了可能也会失败,比如这个代码爬不到VIP章节内容,还可能封了我的IP,所以对抗反爬虫的路也是很长的,学这么点东西还远远不够肆意妄为的。

可以试试用这个获取某些**网站的图片和文字,看明白上边的东西之后就不难了,不说了,大家保重身体 ┗|`O′|┛ 嗷~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章