简单的python爬虫保存百度、360 搜索内容到数据库

import requests

import re

from pyquery import PyQuery as Pq

import pymysql.cursors

connection = pymysql.connect(host='localhost',user='root',password='lihang',db='report',charset='utf8',cursorclass=pymysql.cursors.DictCursor)

inssql = "INSERT INTO gamble (url, title,detailurl) VALUES (%s, %s, %s)"

selsql = "SELECT *  FROM gamble WHERE url=%s"

s = requests.session()

headers = {

            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",

            "Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",

            "Accept-Encoding":"gzip, deflate",

            "User-Agent":"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",

            "Content-Type":"application/x-www-form-urlencoded",

            'Connection':'keep-alive',

            'DNT':'1',

            'Content-Type':'application/x-www-form-urlencoded'

            }

url_360 ="https://www.so.com/s"

pqyload_360 = {

            'q':'房地产',#设置搜索关键字

            'pn':1,

            'ie':'utf8'

            }

url_baidu ="https://www.baidu.com/s"

pqyload_baidu = {

            'wd':'房地产',#设置搜索关键字

            'pn':0,

            'tn':'monline_4_dg',

            'ie':'utf-8'

            }

baimingdan = {#不采集详细网址中包含下列关键字的网站

    "baidu.com",

    "douban.com",

    "tianya.cn"

}

def getbaidu():

    for i in range(100): #设置循环页数

        print(i)

        i=i+1

        r=s.get(url_baidu,params=pqyload_baidu,headers=headers)

        page=Pq(r.content.decode('utf-8'))

        baiduUrls = []

        for site in page('div.result.c-container  h3.t  a').items():

            baiduUrls.append((site.attr('href'),site.text()))

        for tmpurl in baiduUrls:

            flag=True

            try:

                tmpPage = s.get(tmpurl[0],allow_redirects=False)#得到真实页

                try:

                    Ehttpurl = re.match(r"http://.*?/",tmpPage.headers.get('location')).group(0)

                    for bb in baimingdan:#判断白名单

                        if bb in tmpPage.headers.get('location'):

                            flag = False

                            break

                        else:

                            flag = True

                    if flag:

                        with connection.cursor() as cursor:

                            cursor.execute(selsql, (Ehttpurl))

                            result = cursor.fetchone()

                            if(result==None):

                                cursor.execute(inssql, (Ehttpurl, tmpurl[1],tmpPage.headers.get('location')))

                                connection.commit()

                except Exception as e:

                    print(e)

            except Exception as e:

                print(e)

        pqyload_baidu["pn"]+=10#循环结束,开始下一页

def get360 ():

    for i in range(100): #设置循环页数

        i=i+1

        print(i)

        r=s.get(url_360,params=pqyload_360,headers=headers)

        page=Pq(r.content.decode('utf-8'))

        baiduUrls = []

        for site in page('ul.result h3.res-title a').items():

            baiduUrls.append((site.attr('href'),site.text()))

        for tmpurl in baiduUrls:

            flag=True

            try:

                tmpPage = s.get(tmpurl[0])#得到真实页

                try:

                    detailurl = re.search(r'URL=\'(.*?)\'', tmpPage.content.decode('utf-8'), re.S)

                    httpurl = re.match(r"http://.*?/",detailurl.group(1)).group(0)

                    for bb in baimingdan:#判断白名单

                        if bb in detailurl.group(1):

                            flag = False

                            break

                        else:

                            flag = True

                    if flag:

                        with connection.cursor() as cursor:

                            cursor.execute(selsql, (httpurl))

                            result = cursor.fetchone()

                            if(result==None):

                                cursor.execute(inssql, (httpurl, tmpurl[1],detailurl.group(1)))

                                connection.commit()

                except Exception as e:

                    print(e)

            except Exception as e:

                print(e)

        pqyload_360["pn"]+=1#循环结束,开始下一页

get360()

getbaidu()

数据库语句

CREATE TABLE yellow (

  id int(11) NOT NULL AUTO_INCREMENT,

  url varchar(255) DEFAULT NULL,

  detailurl varchar(255) DEFAULT NULL,

  time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

  lv varchar(255) DEFAULT NULL,

  subtime datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,

  title varchar(255) DEFAULT NULL,

  PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

有问题请联系hudcan@sina.com 个人网站:http://ext.123cc.cc

Original: https://www.cnblogs.com/mysgk/p/9427007.html
Author: mysgk
Title: 简单的python爬虫保存百度、360 搜索内容到数据库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622200/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PgSQL-to_char-保留小数位、格式时间格式

    to_char 1.保留小数 格式必须是9。小数点位数前保留位数不足则####;to_char中的第二个参数的小数点后面位数高于第一个参数,会用0补齐;to_char中的第二个参数…

    Java 2023年6月9日
    086
  • Java开发笔记(一百三十九)JavaFX的输入框

    循着Swing的旧例,JavaFX仍然提供了三种文本输入框,分别是单行输入框TextField、密码输入框PasswordField、多行输入框TextArea。这些输入框都由抽象…

    Java 2023年6月6日
    090
  • 若依项目quill富文本提交后缺少了部分html标签

    背景: ruoyi前后端分离项目,后端Springboot,前端vue,富文本控件quill。 问题: 提交含有quill富文本控件的表单,后端接收到的富文本数据,缺少了部分htm…

    Java 2023年6月14日
    080
  • jdk 源码

    https://github.com/openjdk-mirror/jdk/tree/jdk8u/jdk8u%2Fmaster 选择下载的源码路径: Original: https…

    Java 2023年5月30日
    0131
  • Java内部类

    Java中可以将一个类定义在另一个类中或一个方法中,这样的类称为 内部类 内部类一般来说分为下面几种: 成员内部类(可以分为静态成员内部类、非静态成员内部类) 局部内部类 匿名内部…

    Java 2023年6月13日
    064
  • Java SE 6、super关键字,包

    建议:我们需要使用到哪个类,就导入哪个类即可,不建议使用 导入 ​ import java.util.Scanner; //表示只会引入java.util 包下的 Scanner …

    Java 2023年6月7日
    070
  • 浅谈Spring Data ElasticSearch

    Spring Data Spring Data 帮助我们避免了一些样板式代码,比如我们要定义一个接口,可以直接继承接口ElasticSearchRepository接口,这样Spr…

    Java 2023年5月30日
    060
  • Java学习-第一部分-第二阶段-第五节:集合

    集合 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 前面我们保存多个数据使用的是数组,那么数组有不足的地方,我…

    Java 2023年6月16日
    056
  • 解决eclipse中的Java文件,使用idea打开的乱码问题

    转码前: 转码后: 核心方法: new String(content, "GBK").getBytes("utf-8")); 吐槽: 在克隆…

    Java 2023年6月6日
    080
  • Redis 学习笔记之链表

    Redis 学习之链表 简介 Redis lists 能保存 2^32 – 1 个元素,40 亿个元素 Redis lists 是双向链表的数据结构 一、Redis 链…

    Java 2023年6月5日
    088
  • mybatis整合springboot 以及需要注意的细节

    具体怎么整合的网上有很多优秀的博客介绍,这里就直接引用一篇个人觉得非常详细的教程: https://blog.csdn.net/winter_chen001/article/det…

    Java 2023年6月5日
    089
  • Java 单例模式

    什么是单例模式? 单例模式指的是 一个类 只产生 一个实例化对象 目的(作用): 保证在Java应用程序中,一个类Class只有一个实例存在。 常见的模式: 饿汉模式 实现代码: …

    Java 2023年5月29日
    062
  • Java8新特性-Lambda表达式

    总结一下java8中的新特性 lambda表达式 Lambda是一个匿名函数,可以理解为一段可以传递的代码(将代码…

    Java 2023年6月8日
    067
  • Oracle数据库备份/导出(exp/expd)、导入(imp/impd)

    ​ 常用的oracle数据库备份(导入/导出)有两种,分别是exp/imp和expd/impd,前者是Orace早期版本带有的导入导出工具,后者是Oracle10g后出现的,下面进…

    Java 2023年6月8日
    081
  • Spring类加载初始化Bean链路

    1.spring类加载 AbstractApplicationContext.finishBeanFactoryInitialization(…); beanFactory.p…

    Java 2023年5月30日
    057
  • JVM面试题(已归类)

    一年一度的面试高峰期又来了,技术学习群的很多朋友问我有没有关于JVM基础面试题,网上各种面试题没有分类很混乱,无法系统性参考学习。 于是,我就把之前整理的以及我面试过的真题和答案都…

    Java 2023年6月6日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球