0


Python爬虫爬取当当网图书信息(selenium模拟谷歌浏览器版)

代码需求:

  1. 使用静态或动态网页技术获取网站首页数据;
  2. 能够实现当当网主页的网页元素动态交互;
  3. 能够正确解析图书图书编号、名称、作者、出版社、出版时间、价格、简介、图片的URL;
  4. 能够构造6位的图书图片文件名如“000001.jpg”;
  5. 能够实现翻页功能;
  6. 将全部解析的数据存储到 .CSV文件;
  7. 将全部图书的图片存储到当前目录中“download”文件夹;
  8. 将全部解析的数据存储到MySQL或MongoDB数据库。

1.导包

from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver import Chrome
import csv
import pymysql
import os
import requests

其中selenium,pymysql,requests库都要在终端中执行pip install **命令安装库

2.模拟谷歌浏览器

由于是模拟谷歌浏览器,需要在运行代码的计算机上下载有谷歌浏览器,同时也需要根据谷歌浏览器的版本下载相应版本的谷歌浏览器驱动放在PyCharm 项目的根目录下,这里就不在过多赘述了,详情参考https://blog.csdn.net/weixin_44758876/article/details/130317803。

# url是要爬取的网站,这里使用selenium模拟谷歌浏览器爬取
url = "http://www.dangdang.com/"
my_chrome_options = Options()
my_chrome_options.add_experimental_option('detach',True) #不关闭浏览器
driver = Chrome(options=my_chrome_options)
driver.get(url)

# 输入想要爬取的图书类型
tushu = input()
shuru = driver.find_element(By.XPATH,'//*[@id="key_S"]')
shuru.send_keys(tushu)

# 点击搜索框
dianji = driver.find_element(By.ID, 'form_search_new').find_element(By.CLASS_NAME, 'button')
# selenium点击的元素被遮挡无法操作,所以直接用selenium支持的JS脚本方法点击
driver.execute_script('arguments[0].click()', dianji)
url = driver.current_url

3.爬取需要的内容

在爬取过程中会有图书作者和出版社为空的情况,这种情况下自动为作者和出版社添加"null"值。以及爬取图书图片的url的时候,存在爬取到"https://search.dangdang.com/Standard/Search/Extend/hosts/images/model/guan/url_none.png"的情况,这里我们采用另一种爬取方式以求爬取到正确的图片url。

# 创建一个编号,实现对爬取图书的记录
id = 0
# 创建一个列表,一会将爬取的数据存储到这个列表中,然后将这个列表中的数据存储到example.csv文件中
data = [['图书编号','图书名称','图书作者','图书出版社','图书图片url','图书价格','图书简介']]
# 创建一个循环实现翻页功能
while True:
    div = driver.find_element(By.ID,"search_nature_rg")
    lis = div.find_elements(By.TAG_NAME,"li")
    for li in lis:
        # 创建一个列表存储单个图书的信息
        books = []
        # 图书编号
        id += 1
        print(id)
        books.append(id)
        # 图书名称
        title = li.find_elements(By.TAG_NAME,"a")[1].get_attribute("title")
        print(title, "\n")
        books.append(title)
        p = li.find_element(By.CLASS_NAME,"search_book_author")
        # 图书作者
        try:
            author = p.find_elements(By.TAG_NAME,"a")[0].get_attribute("title")
            print(author, "\n")
            books.append(author)
        except:
            author = "null"
            print(author,"\n")
            books.append(author)

        # 出版社
        try:
            press = p.find_elements(By.TAG_NAME,"span")[2].find_element(By.TAG_NAME,"a").text
            print(press,"\n")
            books.append(press)
        except:
            press = "null"
            print(press,"\n")
            books.append(press)

        # 图书图片url
        src = li.find_element(By.TAG_NAME, "a").find_element(By.TAG_NAME, "img").get_attribute("src")
        if src == "https://search.dangdang.com/Standard/Search/Extend/hosts/images/model/guan/url_none.png":
            src = "http:"+li.find_element(By.TAG_NAME,"a").find_element(By.TAG_NAME,"img").get_attribute("data-original")
            print(src,"\n")
            books.append(src)
        else:
            print(src,"\n")

            books.append(src)

        # 价格
        price = li.find_element(By.CLASS_NAME,"price").find_element(By.TAG_NAME,"span").text
        print(price,"\n")
        books.append(price)

        # 图书简介
        introduction = li.find_element(By.CLASS_NAME,"detail").text
        print(introduction,"\n")
        books.append(introduction)
        data.append(books)

    # 实现翻页功能 查找下一页点击按钮来翻到下一页
    pagenumber = driver.find_element(By.XPATH,'//*[@id="12810"]/div[5]/div[2]/div/ul')
    try:
        pageturning = pagenumber.find_element(By.CLASS_NAME,"next").find_element(By.TAG_NAME,"a")
        pageturning.click()
        url = driver.current_url
    except:
        break

4.存储爬取的数据到csv文件中

# 打开文件,追加a模式,将爬取的数据存储到example.csv文件中 注意!!!每次重新跑代码之前,要将example.csv文件删除否则会重复存储多余数据
with open('example.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

5.存储爬取的数据到MySQL数据库中

注意:需要运行代码的计算机中安装有MySQL数据库

# 将数据存储到数据库中 注意!!!每次跑代码之前将数据库创建的表删除,否则会重复存储多余数据
# 连接到数据库
conn = pymysql.connect(
    user = "root", # 数据库用户名
    password = "123456", #密码
    host = "localhost", #本地机器
    database = "ku", #需要预先创建此库 库名为ku
    port = 3306,
)
print(conn.db) #查看连接是否成功
# 创建一个游标对象
cursor = conn.cursor()
# sql语句创建一个存储数据的表
sql1 ="""create table if not exists dangdang(
        id int primary key AUTO_INCREMENT not null comment '自增id',
        title varchar(255) comment '图书标题',
        author varchar(50) comment '作者',
        press varchar(50) comment '出版社',
        src varchar(255) comment '图片网址',
        price varchar(10) comment '价格',
        introduction TEXT comment '简介'
)comment '当当图书';"""
# 执行sql语句并查看是否执行成功
result1 = cursor.execute(sql1)
print(result1)

# 将data列表中的每条图书数据存储到数据库中
error = 0
for i in data[1:]:
    # print(i)
    try:
        item = i
        sql2 = "insert into dangdang (title,author,press,src,price,introduction) "\
            f"values ('{item[1]}','{item[2]}','{item[3]}','{item[4]}','{item[5]}','{item[6]}')"
        # 执行sql语句并查看是否执行成功
        result2 = cursor.execute((sql2))
        # print(result2)
    except:
        error += 1
        # print("有些数据会导致sql语句出错")
print("出错数据:"+str(error)+"条")

# 提交事务
conn.commit()
print("DB commit()!")
# 关闭游标和连接
conn.close()
cursor.close()

6.将爬取图书的图片下载下来

# 保存图片 注意!!!每次重新跑代码之前,将保存图片的目录删除,否则会报错
# 下载图片的函数
def download_image(url, save_path, filename):
    # 发送HTTP请求获取图片内容
    response = requests.get(url)
    # 检查请求是否成功
    if response.status_code == 200:
        # 创建目录(如果不存在)
        if not os.path.exists(save_path):
            os.makedirs(save_path)
        # 图片的完整保存路径
        save_to = os.path.join(save_path, filename)
        # 保存图片
        with open(save_to, 'wb') as f:
            f.write(response.content)
        print(f'图片已保存至 {save_to}')
    else:
        print(f'请求失败,状态码:{response.status_code}')

# 图片保存的目录
save_directory = 'download'
# 递增id
id = 0
for i in data[1:]:
    id += 1
    # 图片的URL
    image_url = i[4]
    # 图片的新文件名
    new_filename = f'{id}.jpg'.rjust(10,'0')
    # 调用函数下载并保存图片
    download_image(image_url, save_directory, new_filename)

7.结果展示

源文件下载:https://download.csdn.net/download/m0_74149104/89889528

标签: selenium python 爬虫

本文转载自: https://blog.csdn.net/m0_74149104/article/details/142897464
版权归原作者 m0_74149104 所有, 如有侵权,请联系我们删除。

“Python爬虫爬取当当网图书信息(selenium模拟谷歌浏览器版)”的评论:

还没有评论