简单的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)

大家都在看

  • 240_Springboot整合rabbitmq集群配置详解

    引入starter 详细配置 Spring AMQP的主要对象 使用 引入starter org.springframework.boot spring-boot-starter-…

    Java 2023年6月7日
    0114
  • Spring 源码(2)Spring IOC 容器 前戏准备工作

    Spring 最重要的方法refresh方法 根据上一篇文章 https://www.cnblogs.com/redwinter/p/16141285.html Spring Be…

    Java 2023年6月14日
    080
  • [Java]判断Integer值相等最好不用==最好使用equals

    测试代码 结果输出: Integer为对象判断是否相等还是使用equals最靠谱,int为基本类型,判断是否相等就是可以使用== 其中的原因: 这是源码中的,也就是说cache中已…

    Java 2023年5月29日
    072
  • 稀疏数组转换思路及代码实现

    基本功能 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用 稀疏数组来保存该数组。 处理方法 记录数组 一共有几行几列,有多少个 不同的值 把具有不同值的元素的行列及值…

    Java 2023年6月16日
    086
  • 一条 SQL 语句是如何执行的

    一条 SQL 语句是如何执行的 SQL查询语句 select * from user where ID=10; MySQL 的基本架构可以分为 Server 层和存储引擎两部分。S…

    Java 2023年6月8日
    080
  • 分布式锁

    分布式锁 本文整理自黑马程序员相关资料 问题的引入 在平时单服务的情况下,我们使用互斥锁可以保证同一时刻只有一个线程执行自己的业务。原理是,在JVM内部维护了一个锁监视器,锁监视器…

    Java 2023年6月8日
    076
  • mysql查出指定时间段中的每天的日期

    背景:数据库中某个业务表产生的数据日期不连续的,比如出库表,本月5号和27号可能都没有出库记录。前端报表组件要求传入连续的日期以便渲染数据 需求:返回指定日期时间段内的每天的出库量…

    Java 2023年6月8日
    070
  • Effective Java 第三版——83. 明智谨慎地使用延迟初始化

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    086
  • 编译原理实验LL1分析

    // 下面是实验三的&am…

    Java 2023年6月5日
    093
  • java BigDecimal解决浮点数的精度丢失和大数计算问题

    抛出浮点数问题: 先考个题,输入什么? System.out.println(0.1 + 0.2); 答案: 0.30000000000000004 在我们日常数学计算中,0.1+…

    Java 2023年6月16日
    0110
  • mybatis plus通过java代码进行权限等全局控制

    在mapper.xml中调用java静态方法,并且传递一些参数 在静态方法中进行sql拼接,可以用于用户权限管理、数据权限管理等等 一、静态方法 拼接sql,可以调用缓存中的用户权…

    Java 2023年6月16日
    068
  • 基于监控服务打造微服务治理生态体系

    基于上一篇《微服务海量日志监控平台》介绍的平台架构,继续架构的优化和能功的扩展,实现服务治理能力。 问题现状态 日志监控平台为我们带来了很多排查解决线上问题的便利。但是从某种程度上…

    Java 2023年6月6日
    098
  • Java中的包装类(Interage和String)

    包装类的分类 包装类的特点 包装类有了类的属性就可以调用类中的方法,更有了类的特点,还可以进行类型的互相转换,更方便我们使用。 包装类和基本数据类型的转换 jdk5前的手动装箱和拆…

    Java 2023年6月6日
    070
  • 绘制几何图形

    《零基础学Java》 绘制几何图形Java可以 分别使用 Graphics 和 Graphics2D 绘制图形, Graphics类 使用不同的方法绘制不同的图形(drawLine…

    Java 2023年6月9日
    070
  • 根据ip查询 地址信息

    这次调用了jsoup.jar包,使用它获取网上的资源获取网址https://ip138.com/的数据进行返回数据 import org.jsoup.Jsoup; import j…

    Java 2023年6月7日
    099
  • java代码生成封面

    public class XWPFTest {public static void main(String[] args) throws IOException {//创建一个do…

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