使用Xpath爬取人邮教育社区的书籍信息

爬取链接: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)

最后成功的将内容存入数据库中
在这里插入图片描述
注意,爬虫有风险,不要随意爬,更不要触碰法律的底线!!!

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值