网上找了好多关于爬虫的例子,不过还是对新手不是很友好的,这里记录一下自己弄爬虫的一些过程。
学会爬虫需要什么?
这里是我想吐槽的,有很多例子它都是以一个特定的网站为例子的,我们如果按照它的步骤一步一步走下去我们是可以成功的,不过这对于我们学习爬虫来说并没有什么较多的帮助的。
1.掌握HTML
我觉得这是学会爬虫必须要掌握的,爬虫其实就是模拟浏览器的各种请求,获得到我们想要的数据,而在对于我们来说最容易获得的就是页面的HTML内容。通过检查我们可以查看到文章的整体结构,这对于我们后续的数据筛选是非常有帮助的。
2.掌握通过浏览器捕获数据
通过右键检查进入到浏览器Network模块,观察浏览器发送的XHR,JS,DOC请求其中我们想要的文件基本都在这些请求中可以捕获到,找对我们想要的请求后就可以在Python中进行模拟。
3.掌握Headers以及Get,Post方法
这些内容我们可以在检查中获得,当然如果能进一步了解就更好了
4.掌握python中关于爬虫的类库
这对将来提高你的开发效率是非常有帮助的,入门阶段不推荐过多使用
掌握上面的这些爬取一些简单的东西都是没有问题的,不过对于一些需要登录等操作的网址内容的爬取,则需要对cookie等内容有一定了解。
如何去写一个爬虫
1.通过检查网页,检测请求获得我们需要模拟的接口
2.通过Python模拟请求
3.处理获得的数据
实例:爬取小说 青春猪头少年不会梦到兔女郎学姊
这里只是简单将其爬取之后转成了HTML存储
爬取思路:
小说地址:https://www.x23qb.com/book/671/24853764.html
小说的爬取一般比较简单,我们可以直接在HTML文档中获得我们想要的数据,这样就使得我们不要在通过复杂的Network模块去找到我们需要数据的接口,我们只需要通过GET方法请求浏览器地址,通过
resp.content.decode('gbk')
将或得的内容转成HTML文本,在通过正则方法找到下一页的 a标签获得下一页的url(为了方便后续在本地观看我在代码里将上一页和下一页改为了本地路径)
import requests # 导入requests库,需要安装
from urllib import parse
import re
# 模拟成浏览器访问的头
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',
'accept': 'text/html',
'accept-language': 'zh-CN,zh;q=0.9'}
mianUrl = "https://www.x23qb.com/"
def getPage(mianUrl,nextUrl,i,oldPage):
jump = 0
try:
resp = requests.get(mianUrl+nextUrl, headers=headers)
jump = 0
except:
jump = 1
if jump == 0:
# 获取到当前页面内容
htmlText = resp.content.decode('gbk')
pageUrl = "青春猪头少年不会梦到兔女郎学姊"+str(i)+".html"
# 实际跳转的下一页 上一页
nextpages = "./青春猪头少年不会梦到兔女郎学姊"+str(i+1)+".html"
upPage = "./青春猪头少年不会梦到兔女郎学姊"+str(i-1)+".html"
try:
# 替换上一页
htmlText = htmlText.replace(oldPage, upPage) # 上一页
print("上:" + oldPage)
oldPage = nextUrl
breaks = 0
try:
# 获得将要替换的下一页
nextPage = re.search(r'<a[/a-zA-Z0-9.=\s_">]*下一页', htmlText)
nextPage = re.search(r'"[/a-zA-Z0-9.=\s_]*"', nextPage.group())
nextUrl = nextPage.group()[1:-1]
# 替换下一页
htmlText = htmlText.replace(nextUrl, nextpages) # 下一页
print("下:" + nextUrl)
except:
breaks = 1
fo = open("./books/book1/"+pageUrl, "w+", encoding="gbk")
fo.write(htmlText)
fo.close()
print("继续"+str(i)+":"+pageUrl)
i += 1
if breaks != 1:
getPage(mianUrl,nextUrl,i,oldPage)
else:
print("success")
except Exception as e:
print(str(e)+"结束")
else:
print("请求异常重新请求"+str(i))
getPage(mianUrl, nextUrl, i, oldPage)
nowPage = "/book/671/24853764.html"
getPage(mianUrl,nowPage,352,"nooldPage")