爬取简书思路:

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)


总结:多交流,多操作,多爬取,多思考。


posted on 2020-05-19 19:15  Leilok  阅读(217)  评论(0编辑  收藏  举报