作者:冰凌清泽_712 | 来源:互联网 | 2023-09-03 14:00
本文由编程笔记#小编为大家整理,主要介绍了爬取简书相关的知识,希望对你有一定的参考价值。
爬取简书思路:
1)使用selenium模拟浏览器打开网页
2)由于分页是通过点击【阅读更多】按钮来加载数据的,因此需要模拟单击该按钮
3)确定要爬取多少页的数据,如果要爬取10页的数据,就需要模拟单机10次【阅读更多】按钮
4)单击该按钮后,需要定位这个信息列表元素,然后使用xpath提取数据
5)提取到该数据之后,将它保存到mysql数据库中
第一个错误
第二个错误
第三个错误
附上源码:
1 import time
2 import pymysql
3 from lxml import etree
4 from selenium import webdriver
5
6 # 浏览器操作对象
7 driver = webdriver.Chrome()
8 # 爬取的url
9 driver.get(‘https://www.jianshu.com/‘)
10
11
12 # 加载更多
13 def load_mord(num):
14 # 通过观察发现, 打开页面需要鼠标滑动5次才会出现【阅读更多】按钮
15 for i in range(5):
16 js = "var q = document.documentElement.scrollTop = 1000000"
17 driver.execute_script(js)
18 # 休眠 2 秒
19 time.sleep(2)
20 if num == 0:
21 # 休眠 2 秒
22 time.sleep(2)
23 # 定位并单击【阅读更多】按钮加载更多
24 load_more = driver.find_element_by_class_name(‘load-more‘)
25 # 点击
26 load_more.click()
27
28
29 def get_html():
30 """获取内容源码"""
31 note_list = driver.find_element_by_class_name(‘note-list‘)
32 html = note_list.get_attribute(‘innerHTML‘)
33 return html
34
35
36 def extract_data(content_html):
37 """传入内容网页源码,使用Xpath提取信息标题,简介,发布昵称"""
38 html = etree.HTML(content_html)
39 # 标题
40 title_list = html.xpath(‘//li//a[@class="title"]/text()‘)
41 # 简介
42 abstract_list = html.xpath(‘//li//p[@class="abstract"]/text()‘)
43 # 昵称
44 nickname_list = html.xpath(‘//li//a[@class="nickname"]/text()‘)
45
46 data_list = []
47
48 for index, x in enumerate(title_list):
49 item = {}
50
51 item[‘title‘] = title_list[index]
52 item[‘abstract‘] = abstract_list[index]
53 item[‘nickname‘] = nickname_list[index]
54 data_list.append(item)
55 return data_list
56
57
58 def insert_data(sql):
59 # db = pymysql.connect("127.0.0.1", 3306, "root", "python", "xs_db", charset="utf8")
60 # 链接mysql
61 db = pymysql.connect(
62 host=‘localhost‘,
63 port=3306,
64 user=‘root‘,
65 passwd=‘python‘,
66 db=‘xs_db‘,
67 charset=‘utf8‘
68 )
69 try:
70 cursor = db.cursor()
71 return cursor.execute(sql)
72 except Exception as ex:
73 print(ex)
74 finally:
75 # 数据库提交
76 db.commit()
77 # 关闭数据库
78 db.close()
79
80
81 # 模拟点击2次
82 for x in range(2):
83 print(‘模拟点击加载更多第{}次‘.format(str(x)))
84 load_mord(x)
85 time.sleep(1)
86
87 resuts = extract_data(get_html())
88 for item in resuts:
89 # 插入数据
90 sql = "insert into tb_test(title,abstract,nickname) values (‘%s‘,‘%s‘,‘%s‘)" % (
91 item["title"], item["abstract"], item["nickname"])
92 insert_data(sql)
总结:多交流,多操作,多爬取,多思考。