学这个之前请确保自己对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′|┛ 嗷~~