【实战】爬虫
import requests
import requests_html
from requests_html import HTMLSession
from lxml import etree
basic_url='abababababa'
next_url='ababababaab'
headers={
'User-Agent': 'ababababababababababababababa'
}
session=HTMLSession()
f=open('book.txt','a+',encoding='utf-8')
while next_url:
url=basic_url+next_url
response=session.get(url,headers=headers)
response.html.render()
html=str(response.html.text)
html=etree.HTML(html)
txt=[]
txt=response.html.xpath('.//*[@id="txt"]/dd/p/text()')
for t in txt:
print(t)
f.write(t)
f.write('\n')
next_url=response.html.xpath('.//*[@id="readController"]/div/div/div[2]/div[1]/div[5]/a[3]/@href')
next_url=next_url[0]
分析代码:
basic_url='www.ababa.com'
next_url='www.abababa.com'url=basic_url+next_url
所爬取的网站网址采用前半段固定,后半段改变的形式,故将网址拆分成两部分,爬取的时候再将二者连接。
session=HTMLSession()
response=session.get(url,headers=headers)
response.html.render()
个人喜欢用requests库来爬取的,但是爬到一半发现这个小网站居然前半章的小说用js渲染的,用requests只能爬到每章的后半节,无奈采用requests_html来爬取,因为可以渲染js(response.html.render()就是用来渲染js的)。然后貌似请求不加请求头(headers)也可以得到内容。
txt=[]
txt=response.html.xpath('.//*[@id="txt"]/dd/p/text()')
for t in txt:
print(t)
f.write(t)
f.write('\n')
先建立一个名为“txt”的空列表,再用它来装小说文本内容,用的是Xpath来提取内容。网站上的内容是分好段落的,所以刚好列表里每个元素都是单独一段,在写入文本文档(.txt)后再写入一个换行符(\n)即可。
next_url=response.html.xpath('.//*[@id="readController"]/div/div/div[2]/div[1]/div[5]/a[3]/@href')
next_url=next_url[0]
这段代码是用于获取下一章内容的网址的后半段的。也是用Xpath获取因为简单。


最后用while来循环:
while next_url:
当没有下一章即结束时,next_url为空,跳出循环,爬取小说结束。
更多推荐
所有评论(0)