• 爬取简书


    爬取简书思路:

    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)

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


  • 相关阅读:
    SQL后台分页三种方案和分析
    SQL分页查询语句
    SQL利用临时表实现动态列、动态添加列
    查询sybase DB中占用空间最多的前20张表
    敏捷软件开发之TDD(一)
    敏捷软件开发之开篇
    Sql Server 2012启动存储过程
    改变VS2013的菜单栏字母为小写
    Sql Server获得每个表的行数
    Sql Server trace flags
  • 原文地址:https://www.cnblogs.com/wutongluo/p/12918906.html
Copyright © 2020-2023  润新知