如何利用爬虫技术爬取自己想要的数据以及图片
前置知识
你需要会懂python 基础 会就行 爬虫库有很多本期会采用request 特点是简单易用相对于 scrapy框架来说。
通过分享篇案例来教会你使用爬虫技术
利用request库爬取百度小说文章
第一步我们找到https://dushu.baidu.com/
第二步分析页面是服务端渲染,客户端渲(通常客户端渲染一般都是开始就是使用的服务器发送了一个空的html,然后再通过点击或者初始化的时候再向服务器请求接口数据),服务端渲染(通常是服务器直接发送了一个完整的html),可以根据你要爬的数据名称 通过浏览器查看源码里面搜索一般有就是服务端渲染,没有就是服务器渲染,服务端渲染可以直接请求网站地址,通过html解析库将数据提取到手,比较简单,本案例通过前面的方法得出是客户端渲染,则需要通过浏览器的接口请求查看方法查看是那一个接口调取的数据。
根据上图所示是https://dushu.baidu.com/api/getChoiceData这个接口调用拿到的数据,查看有无必要请求参数经过测试没有。
import requests
def requesum(url):
res=requests.get(url)
dic=res.json()
return dic
if __name__=="__main__":
url='https://dushu.baidu.com/api/getChoiceData'
res=requesum(url)
print(res)
成功拿到自己想要的数据,返回的是一个json,可以直接通过[key]的形式提取
根据我以往的经验这个应该是书籍Id用于存储此书的唯一id,存储在数据库中的,先存取这个i的
我们接着分析,点开这个“琅琊榜值风起长林”,可以看到url上面有这个id,大概率这个id就是书籍id了
然后通过分析得知是这个接口http://dushu.baidu.com/api/pc/getCatalog?data={“book_id”:“‘+book_id+’”}
请求接口 得到所有目录id
通过目录id提取当前文章内容
完整代码如下
import requests
import aiohttp
import asyncio
import time
def requesum(url):
res=requests.get(url)
dic=res.json()
cartid=dic['data']['novel']['items']
return cartid
async def main(catalogue):
task=[]
for item in catalogue:
task.append(asyncio.create_task(dowload(item['title'],item['cid'],book_id)))
await asyncio.wait(task)
async def dowload(title,cid,book_id):
url='http://dushu.baidu.com/api/pc/getChapterContent?data={"book_id":"'+book_id+'","cid":"'+book_id+'|'+cid+'","need_bookinfo":1}'
print(url)
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
data=await resp.json(encoding="utf-8")
data=data['data']['novel']['content']
with open('西游记\\'+title+'.txt',mode="w+",encoding='utf-8') as f:
f.write( data)
if __name__=="__main__":
p=time.time()
book_id="4306063500"
#url="https://blog.youkuaiyun.com/weixin_30872867/article/details/96723207"
url='http://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"'+book_id+'"}'
catalogue=requesum(url)
asyncio.run(main(catalogue))
print(time.time()-p)