因为数据库作业需要爬取晋江的数据,本着不写白不写的原则分享一下爬取过程
1.import需要用到的库
import requests
import pandas as pd
from lxml import etree
import openpyxl
这里的requests用于获取网页的内容,返回值为html格式,etree用于对requests获得的数据进行处理,pandas库在后面格式化保存数据要用到
2.使用requests.get()获取网页数据
这里我爬取的是积分总榜,网页为https://www.jjwxc.net/topten.php?orderstr=7&t=2
url='https://www.jjwxc.net/topten.php?orderstr=7&t=2'
r=requests.get(url)
print(r.status_code)
#r.status_code=200说明服务器成功返回网页
#由于默认html编码格式为‘utf-8’,而晋江的编码为‘gb18030’,故要对爬取的数据进行解码
rt=r.content.decode('gb18030')
et=etree.HTML(rt)#这里使用etree
3.在爬取的数据中选择我们所需要的内容
简单浏览一下数据,可以看见小说标题和作者都在元素<a>里面,而元素<a>在元素table[3]里面,故获取小说名和作者的xpath路径为:book=et.xpath('//table[3]//a/text()')
book=et.xpath('//table[3]//a/text()')
print一下book查看结果,得到的结果为:
(太多了没截完)
然后分别用相应的list存放数据:
book_title=[]
book_author=[]
book_type=[]
for i in range(0,len(book),2):
book_author.append(book[i])
book_title.append(book[i+1])
接下来爬取每个小说的标签
我们注意到每个小说的标签在当前页面是没有的,每个小说的标签只能在小说的具体页面看到,如图:
所以要爬取标签,首先要爬取榜单中每本小说的页面链接。从爬取的数据中我们可以看到,小说标签的xpath路径为: link=et.xpath('//table[3]//a[@class="tooltip"]/@href')
link中的数据为:
故用循环依次通过link列表中的链接爬取小说标签
head='https://www.jjwxc.net/'#别忘了加上开头,link中爬取的页面链接缺少这个头
for s in link:
s=head+s
r=requests.get(s)
#print(r.status_code)
rt=r.content.decode('gb18030',errors='ignore')
#print(rt)
et=etree.HTML(rt)
sr=[]
sr=et.xpath('//a[@style="text-decoration:none;color: red;"]/text()')
#print(sr)
book_type.append(sr)
则book_type中的内容为:
4.将三个表合成一个,以excel格式输出
data=list(zip(book_title,book_author,book_type))
columns=['书名','作者','类型']
df=pd.DataFrame(data,columns=columns)
df.to_excel('晋江小说总积分排行.xlsx', index=False)
print("finish!")
5.总体代码
import requests
import pandas as pd
from lxml import etree
import openpyxl
url='https://www.jjwxc.net/topten.php?orderstr=7&t=2'
r=requests.get(url)
print(r.status_code)
#r.status_code=200说明服务器成功返回网页
#由于默认html编码格式为‘utf-8’,而晋江的编码为‘gb18030’,故要对爬取的数据进行解码
rt=r.content.decode('gb18030')
et=etree.HTML(rt)#这里使用etree
book=et.xpath('//table[3]//a/text()')
book_title=[]
book_author=[]
book_type=[]
for i in range(0,len(book),2):
book_author.append(book[i])
book_title.append(book[i+1])
head='https://www.jjwxc.net/'#别忘了加上开头,link中爬取的页面链接缺少这个头
for s in link:
s=head+s
r=requests.get(s)
#print(r.status_code)
rt=r.content.decode('gb18030',errors='ignore')
#print(rt)
et=etree.HTML(rt)
sr=[]
sr=et.xpath('//a[@style="text-decoration:none;color: red;"]/text()')
#print(sr)
book_type.append(sr)
data=list(zip(book_title,book_author,book_type))
columns=['书名','作者','类型']
df=pd.DataFrame(data,columns=columns)
df.to_excel('晋江小说总积分排行.xlsx', index=False)
print("finish!")