zoukankan      html  css  js  c++  java
  • python 爬取数据存入数据库 分页拉取

    #!/usr/bin/env python
    # coding=utf-8
    
    import requests
    from bs4 import BeautifulSoup
    import pymysql
    import re
    
    # 连接数据库
    connect = pymysql.Connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        passwd='123456',
        db='xunrui',
        charset='utf8'
    )
    # 获取游标
    cursor = connect.cursor()
    
    #行缩进只能用tab,否则报错不能用空格缩进
    # 解析链接
    def parse(url):
        # 给定一个初始的url
        url='http://www.jingyu.com/search/stack?pn=1'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
        }
        html = requests.get(url, headers=headers)
        tests = html.text
        soup = BeautifulSoup(tests,'lxml')
    
        # <li class="book clearfix">
        # <div class="clearfix">
        # <a href="/novel/MdOkDBG2NXC3QD.html"><img class="pull-left cover" data-src="http://oss.ledu6.cn/book_img/28_335_1605065910.jpg" src="//p1.ssl.qhimg.com/d/inn/238e67af/defaultCover.png"/></a>
        # <div class="layout">
        # <h3 class="name"><a href="/novel/MdOkDBG2NXC3QD.html">这该死的豪门,不嫁了</a></h3>
        # <p class="author"><a href="/search/?author=%E6%91%98%E6%98%9F%E6%8F%BD%E6%9C%88">摘星揽月</a> | <a href="/search/stack?category=66">婚恋家庭</a></p>
        # <p class="intr">简介:他说:“女人,帮帮我,我可以给你一切。”
        #        那夜纠缠后,她消失不见,那抹留在昂贵车座上的痕迹,犹如一朵玫瑰花。 满城搜寻,他再度出现在她面前,他说:“俞静雅,我可以给你一个家。”</p>
        # </div>
        # </div>
        # </li>
    
        # 找到li标签,该标签内有两个class属性,分别为book,clearfix
        data = soup.find_all('li',{'class':{'book','clearfix'}})
        for i in data:
            name = i.h3.a.text #得到a后面的内容
            zz_f1=i.p.text
            # 将得到的数据按|来拆分,拆分后为一个列表,其中有两个元素,但元素中有空格: 擎天柱 | 都市传奇    尽头 | 都市传奇
            # 所以要使用strip来去除空格
            zz_f1=zz_f1.split('|') #['擎天柱 ', ' 都市传奇']  ['尽头 ', ' 都市传奇']
            zuoze = zz_f1[0].strip() #擎天柱   尽头
            fenlei=zz_f1[1].strip()  #都市传奇 都市传奇
            print('书名:{0}  作者:{1}  类别:{2}'.format(name,zuoze,fenlei))
             # 将得到的数据传送给MySQL
            mysql(name,zuoze,fenlei)
    
        # 解析完后再进行下一步解析
        next_page(url)
    
    
    # 新建对象,然后将数据传入类中
    def mysql(name,zuoze,fenlei):
        down = down_mysql(name,zuoze,fenlei)
        down.save_mysql()
    
    
    # 定义一个类,将连接MySQL的操作写入其中
    class down_mysql:
        def __init__(self,name,zuoze,fenlei):
            self.name=name
            self.zuoze=zuoze
            self.fenlei=fenlei
            # self.connect = pymysql.Connect(
            #     host='127.0.0.1',
            #     port=3306,
            #     user='root',
            #     passwd='123456',
            #     db='xunrui',
            #     charset='utf8',
            #     use_unicode = False
            # )
            # self.cursor = self.connect.cursor()
    
        #上面链接数据库,下面保存数据到数据库中
        def save_mysql(self):
            #print(self.name)
            try:
                sql = "INSERT INTO xiaoshuo(name,zuoze,fenlei) VALUES ('%s','%s','%s')"
                data = (self.name,self.zuoze,self.fenlei)
                # self.cursor.execute(sql % data)
                # self.connect.commit()
                cursor.execute(sql % data)
                connect.commit()
                print('成功插入', cursor.rowcount, '条数据')
            except Exception as e:
                #print('数据插入错误')
                 print('程序出错',e)
    
    
    # 查找下一页url
    def next_page(nextpage):
        # 将得到的下一页的url由自己指定
        # 匹配http://www.jingyu.com/search/stack?pn=1后面的数字
        #group() 同group(0)就是匹配正则表达式整体结果, group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
        # import re
        # a = "123abc456"
        # print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整体
        # print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
        # print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
        # print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456
        a = re.search('pn=(.*)',nextpage).group(1)
        # 匹配http://www.jingyu.com/search/stack?pn=1数字前面的值
        # 这里我不用字符串的split('='),主要为了练习正则
        start_url=re.findall('.*pn=',nextpage)[0] #http://www.jingyu.com/search/stack?pn=
        #print(start_url)
        a=int(a)
        # 总共25页,只需要爬取25页就可以
        if a<= 25:
            a+=1
            nextpage = start_url+str(a)
            if a<=25:
                #只要url 还未到25页,那么继续解析
                parse(nextpage)
            else:
                print('结束翻页')
    
    
    
    if __name__ == '__main__':
        # 给定一个初始的url
        url='http://www.jingyu.com/search/stack?pn=1'
        # 解析该url
        parse(url)
  • 相关阅读:
    java得到当前日期的前一天或后一天
    java通过年月得到该月每一天的日期
    前后端分离的跨域请求问题解决
    关于java中分割字符串
    Linux终端命令
    eclipse中tomcat可以start启动,无法debug启动的解决
    通过DOS界面查看电脑上端口使用情况
    前端css
    mysql数据库
    IO阻塞
  • 原文地址:https://www.cnblogs.com/yszr/p/15031351.html
Copyright © 2011-2022 走看看