爬取链接:https://www.ryjiaoyu.com/tag/details/7
我们只需要获取书名、作者、价格、详情链接的信息
代码如下:
import requests #调用requests库
import csv #调用csv模块
from lxml import etree #调用lxml库
def get_html(url): #建立get_html函数,实现网页内容获取
try:
headers={"User-Agent":"Mozilla/5.0 Chrome/77.0.3865.90 Safari/537.36"}
r = requests.get(url,headers=headers) # 发送请求,获取响应
r.encoding = r.apparent_encoding #获取对应的编码方式
r.raise_for_status() #是否获取有误
html = r.text # 内容获取并赋值给html
return html #返回网页的文本内容
except Exception as error: #返回错误
print("网页内容获取失败")
result_list = [] #存取爬取内容
def parse(html): #解析
html = etree.HTML(html)
for row in html.xpath('//*[@id="tag-book"]/div/ul/li/div[2]'):
name = row.xpath("h4/a/text()")[0] #书名
# print("name",name)
url = row.xpath("h4/a/@href")[0] # 链接详情
# print("url",url)
author=row.xpath("div/span/text()")[0].strip() #作者
# print("author",author)
price=row.xpath("span/span/text()")[0] #价格
# print("price",price)
list = []
list = [name, url,author,price] #标题,链接详情
result_list.append(list)
return result_list
def save(item, path): # path文件保存路径,item数据列表
with open(path, "w+", newline='') as f:
write = csv.writer(f)
write.writerows(item)
if __name__ == "__main__":
url = "https://www.ryjiaoyu.com/tag/details/7"
parse(get_html(url)) #引用parser函数,爬取内容
save(result_list,"D:/test.csv") #列表的形式保存
上面的代码只能爬取第一页的,因此为了能够多爬点,我加了个循环,然后对解析那稍微进行了一点点改变,代码如下:
def parse(html): #解析
html = etree.HTML(html)
for row in html.xpath('/html/body/div/ul/li'):
bookname = row.xpath("div[2]/h4/a/text()")[0] # 书名
author = row.xpath("div[2]/div/span/text()")[0].strip() # 作者
price = row.xpath("div[2]/span/span/text()")[0] # 价格
url = row.xpath("div[2]/h4/a/@href")[0] # 详情页地址
list = []
list = [bookname, url,author,price] #标题,链接详情
result_list.append(list)
return result_list
if __name__ == "__main__":
for i in range(0,2): #分页爬取
url="https://www.ryjiaoyu.com/tag/books/7?page={}".format(i)
result=parse(get_html(url))
save(result,"D:/test1111.csv")
其他的代码都没变
如果想将爬取的内容存入数据库中,那就先在数据库中创建好相应的表和字段,可以写代码创建,也可以直接快速右键创建:
USE test;
CREATE table bookinfo(
Id Int AUTO_INCREMENT PRIMARY key, #自增长主键
bookName varchar(100) CHARACTER set utf8,#书名
auth varchar(100) CHARACTER set utf8, #作者
price varchar(100) CHARACTER set utf8, #价格
url varchar(100) CHARACTER set utf8 #链接
)
下面是写入数据库的主要代码
#分页
import requests
import pymysql
def save(items): # 将获取到的内容保存到pymysql文件中
connect = pymysql.connect(host="localhost", user="root", password="123456", port=3306,
database="test", charset="utf8")#获取连接对象
cursor = connect.cursor()#获取游标对象
try:
sql = "insert into bookinfo(bookname,auth,price,url) values(%s,%s,%s,%s)"#将解析到的数据插入到mysql中
for item in items:
cursor.execute(sql,tuple(item))#执行sql
print("保存成功!")
connect.commit()#提交事务
except Exception as err:
connect.rollback()#事务回滚
print(err)
finally:
cursor.close() # 关闭游标
connect.close() # 关闭链接
if __name__ == "__main__":
for i in range(0, 5): # 分页
url="https://www.ryjiaoyu.com/tag/books/7?page={}".format(i)
parser(get_html(url)) # 引用parser函数,爬取内容
save(result_list)
最后成功的将内容存入数据库中
注意,爬虫有风险,不要随意爬,更不要触碰法律的底线!!!