刚接触爬虫,用爬虫爬了一个不需要登录的网站:起点中文网,爬取了它的收藏榜单,但只筛选出了小说的排行和名字还有作者姓名,原本还打算加上简介,但是简介的源代码存在问题,用同样的方法爬取出的简介的结果是一片空白,放到之后接触更深之后再思考是不是方法存在问题。
下面附上简单的代码:
import requests #需要的库
import json
from requests.exceptions import RequestException
import re
import time
from bs4 import BeautifulSoup #美丽汤大法好
url = 'https://www.qidian.com/rank/collect?style=1&page=1'
def get_one_page(url):
try: #之前没有加headers被防爬功能禁止了IP
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
response = requests.get(url, headers=headers)
if response.status_code == 200: #成功状态
return response.text
return None
except RequestException:
return None
def parse_one_page(html):
soup = BeautifulSoup(html, 'lxml') #第二个参数解析器类型,这里用lxml
nums=soup.find_all(attrs={'class':'book-img-box'})#序号的标签属性
texts=soup.find_all(attrs={'data-eid':'qd_C40'})#书名...
names=soup.find_all(attrs={'data-eid':'qd_C41'})#作者姓名...
for (num,text,name) in zip(nums,texts,names):#学到新知识:多个参数的for循环用zip()
print('序号:'+num.text+'\t书名:'+text.text+'\t\t'+'作者:'+name.text)
def write_to_file(content):#写入文件
with open('result2.txt','a',encoding='utf-8') as f:
f.write(json.dumps(content,ensure_ascii=False)+'\n')
def main(page):
url = 'https://www.qidian.com/rank/collect?style=1&page='+str(page)#页码不同地址不同,观察发现末尾发生变化
html = get_one_page(url)
parse_one_page(html)
if __name__=='__main__':
for i in range(1,11):#改变页码的地址
main(page=i)
time.sleep(1)#防止速度过快被禁止
下面是部分结果,还存在小缺点就是这个因为书名长度不一样,就没办法用\t来控制对齐,用格式化输出控制应该就会解决,emmmm对,原来是我太天真了,试了很多方法比如str.ljust()和format(),序号和书名可以分开对齐了但是作者老是不能单独对齐,之后编写函数对齐吧:
序号: 1 书名:一念永恒 作者:耳根
序号: 2 书名:圣墟 作者:辰东
序号: 3 书名:修真聊天群 作者:圣骑士的传说
序号: 4 书名:玄界之门 作者:忘语
序号: 5 书名:斗罗大陆III龙王传说 作者:唐家三少
序号: 6 书名:斗破苍穹 作者:天蚕土豆
序号: 7 书名:大主宰 作者:天蚕土豆
序号: 8 书名:不朽凡人 作者:鹅是老五
序号: 9 书名:大唐仙医 作者:秃笔居士
序号: 10 书名:雪鹰领主 作者:我吃西红柿
序号: 11 书名:完美世界 作者:辰东
序号: 12 书名:万界天尊 作者:血红
序号: 13 书名:琴帝 作者:唐家三少
序号: 14 书名:放开那个女巫 作者:二目
序号: 15 书名:美食供应商 作者:会做菜的猫
序号: 16 书名:牧神记 作者:宅猪
序号: 17 书名:盘龙 作者:我吃西红柿
序号: 18 书名:斗罗大陆 作者:唐家三少
序号: 19 书名:我欲封天 作者:耳根
序号: 20 书名:凡人修仙传 作者:忘语
也可以这样哈哈哈 看起来好看多了 就是一点也不实用:
for (num,text,name) in zip(nums,texts,names):
print("*********************")
print('序号:'+num.text)
print('作者:'+name.text)
print('书名:'+text.text)
print("*********************\n")
花里胡哨的效果:
*********************
序号: 1
作者:耳根
书名:一念永恒
*********************
*********************
序号: 2
作者:辰东
书名:圣墟
*********************
*********************
序号: 3
作者:圣骑士的传说
书名:修真聊天群
*********************
*********************
序号: 4
作者:忘语
书名:玄界之门
*********************
*********************
序号: 5
作者:唐家三少
书名:斗罗大陆III龙王传说
*********************