「从零开始学爬虫」以采集中国国际招标网为例

爬取中国国际招标网(https://zggj.zbytb.com/搜索-中国招标与采购网https://zggj.zbytb.com/),并将爬取的数据存储到数据库中,效果图如下:

1、建立数据库和表

数据表——zhaobiao

这里的字段看自己所需。

2、分析中国国际招标网网页

我们大概需要的数据是标题、公告类型、发布时间、省份、公告内容等,所以这里当我们进入网页的第一页时,需要获取分页链接以及公告内容的链接。

① 翻页:

② 公告内容:

3、代码编写

① 连接数据库

下面用户密码等填自己的。

import pymysql
db = pymysql.connect(host='',  # 连接名称
                     user='',  # 用户名称
                     password='',  # 密码
                     database='')  # 数据库名称

print('数据库连接成功')

cursor = db.cursor()

② 分析搜索-中国招标与采购网页面

获取总页数,注意是post还是get请求,这里是post请求

    try:
        print("中国国际招标网,正在获取数据列表")
        r = requests.post(
            'https://www.zbytb.com/search/',
            headers=headers,
            data=data_params,
            timeout=30)
        if r.status_code == 200:
            soup = BeautifulSoup(r.content, 'html.parser')
            # print(soup)
            pages = soup.find('div', class_='pages').find_all('a')[0].get('href').split('page=')[1]
            print(pages)
            print("获取数据成功,获取总页数为:" + str(pages) + "页")
    except Exception as e:
        data = {
            "msg": "获取数据页数,目标url访问失败,中国国际招标网",
            "code": "501",
            "err_msg": e
        }
        print(data["msg"])
        return data

获取每一条招标信息,这里就是get请求

r = requests.get(
                f'https://www.zbytb.com/search/?kw=&okw=&catid=0&zizhi=&zdxm=&zdyear=&field=&moduleid=25&areaids=&page={page}',
                headers=headers,
                timeout=60)

提取招标标题,时间,公告类型,每一条招标信息的详细页面的url以及省份

提取每一条招标信息的详细页面

content_r = requests.get(url, headers=headers, timeout=500, verify=False)

③ 插入数据库中

"""上传至数据库中"""
sql = ('insert into zhaobiao(title,btype_name,pubdate,content,data_source,region_name) '
       'VALUES(%s, %s, %s, %s, %s, %s)')
try:
    cursor.execute("SELECT * FROM zhaobiao WHERE data_source = %s", (url,))
    existing_user = cursor.fetchone()
    if not existing_user:  # 如果不存在重复记录才执行插入操作
        cursor.execute(sql, (
            Title, BTypeName, PubDate, detail, url, RegionName))
        db.commit()
    else:
        print(f"{url} 已存在,不进行插入操作")
except Exception as e:
    db.rollback()
    print(e)

4、代码

import random
import time

import requests
from bs4 import BeautifulSoup
import urllib3

def zhaoBiao4_mian():
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate",
        "Referer": "https://www.google.com",
        "Connection": "keep-alive",
        "Cookie": cookies # cookie需要自行加
    }
    data_params = {
        "moduleid": 25,
        "areaids": "",
        "exareaid": "",
        "field": "",
        "okw": "",
        "obiao": 0,
        "zizhi": "",
        "search": 1,
        "kw": "",
    }
    try:
        r = requests.post(
            'https://www.zbytb.com/search/',
            headers=headers,
            data=data_params,
            timeout=30)
        if r.status_code == 200:
            soup = BeautifulSoup(r.content, 'html.parser')
            pages = soup.find('div', class_='pages').find_all('a')[0].get('href').split('page=')[1]
    except Exception as e:
        data = {
            "msg": "获取数据页数,目标url访问失败",
            "code": "501",
            "err_msg": e
        }
        print(data["msg"])
        return data

    """处理数据流"""
    shuju = 0
    for page in range(1, int(pages) + 1):
        shuju_page = 0
        time.sleep(random.uniform(1, 3))
        try:
            r = requests.get(
                f'https://www.zbytb.com/search/?kw=&okw=&catid=0&zizhi=&zdxm=&zdyear=&field=&moduleid=25&areaids=&page={page}',
                headers=headers,
                timeout=60)
            if r.status_code == 200:
                soup = BeautifulSoup(r.content, 'html.parser')
                print(soup.find('div', class_='list-box simple'))
                data_list = soup.find('div', class_='list-box simple').find('ul').find_all('li')
                for data in data_list:
                    time.sleep(random.uniform(1, 3))
                    shuju_page = shuju_page + 1
                    shuju = shuju + 1
                    title_div = data.find('div', class_='title')
                    url = title_div.find('a')['href']
                    Title = title_div.find('a').get_text().strip()

                    BTypeName = title_div.find('a').get_text()[-4:]

                    PubDate = title_div.find('span').get_text().strip()

                    title_div_span = title_div.find('span', class_='lszz')

                    if title_div_span.find('a'):
                        # 如果存在<a>标签,则取<a>标签的文本内容
                        RegionName = title_div_span.find('a').get_text().replace(' » ', '')
                    else:
                        # 否则,取<span>标签的文本内容
                        RegionName = title_div_span.get_text()

                    """获取内容"""
                    print(url)
                    print("正在抓取****************")
                    try:
                        content_r = requests.get(url, headers=headers, timeout=500, verify=False)
                    except:
                        time.sleep(random.uniform(1, 3))
                        content_r = requests.get(url, headers=headers, timeout=500, verify=False)
                    if content_r.status_code == 200:
                        soup1 = BeautifulSoup(content_r.content, "html.parser", from_encoding="gb18030")
                        detail = soup1.find("div", id="content")
                        data_updata["Content_text"] = str(detail)

                        """上传至数据库中"""
                        sql = ('insert into zhaobiao(title,btype_name,pubdate,content,data_source,region_name) '
                                   'VALUES(%s, %s, %s, %s, %s, %s)')

                        try:
                            cursor.execute("SELECT * FROM zhaobiao WHERE data_source = %s", (url,))
                            existing_user = cursor.fetchone()

                            if not existing_user:  # 如果不存在重复记录才执行插入操作
                                cursor.execute(sql, (
                                    Title, BTypeName, PubDate, detail, url, RegionName))
                                db.commit()
                            else:
                                print(f"{url} 已存在,不进行插入操作")
                        except Exception as e:
                            db.rollback()
                            print(e)
                    else:
                        data = {
                            "msg": "获取详细数据,目标url访问失败,中国国际招标网",
                            "code": "503",
                            "err_msg": r.json()
                        }
                        return data
        except Exception as e:
            data = {
                "code": 502,
                "msg": "中国国际招标网,单个数据抓取失败?????????????????????????????",
                "err_msg": e
            }
            print(data["msg"])
            return data
if __name__ == '__main__':
    data_msg = zhaoBiao4_mian()  # 中国国际招标网

本教程仅供教学使用,严禁用于商业用途!

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
招标搜索软件使用说明 软件使用类似于百度的蜘蛛引擎,每日爬行全国招标信息、政府采购类网站,从中提取出各类有效的招标数据或政府采购信息,用户下载我们的招标搜索软件,免安装即可搜索使用,就可搜索到全国最新的各类招标中标政府采购等信息,从而为企业解决了在获取各类招投标信息时,渠道单一、只使用某一或几个网站进行搜索、导至错失大量有用信息无法知晓。软件在操作上、我们力求以最简单的操作方式来达到最理想的搜索结果,您只需要选择几个不同的搜索条件,即可让你看到意想不到的信息。 采购招标信息 政府网站(公共资源交易中心,政府采购中心)、大型企业网站、代理机构网站等机构采购招标信息,会员(采购商)自主发布采购招标信息,供用户查询。内容包含投标要求、业主、招标公司联系人、联系方式、及购买标书的时间、地点等,每日更新公开招标信息。 政府采购 各省、市、县政府采购单位发布的询价类、比选、竞争性谈判及单一来源采购类信息。 企业采购 国内各大企业、集团公司所发布的直接采购信息,用户可通过非招标的形式,直接和业主方联系,洽谈供货及长期合作事宜。 会员招标采购 中机采招网广大用户发布的招标信息,包括招标内容、采购单位以及联系人、联系方式。中机采招网可推荐符合采购单位要求的认证企业前去参与。 变更通知 是在发布招标公告后补充公告、变更公告、废标公告、重新招标信息,使用户可以及时获知,并有效的对投标工作做出相应方案调整,以免因此导致投标失误。 标书下载 部分招标项目可向用户提供电子版标书下载服务,标书内容包含项目采购清单、商务文件、技术参数、评标办法、报名表等,省去因盲目购买标书而损失的财力和时间成本。 中标信息 政府网站(公共资源交易中心,政府采购中心)、大型企业网站、代理机构网站等机构中标信息,供用户查询。提供中标单位、中标项目、中标金额,为会员提供直接供货渠道。更有利于会员为中标企业在后期分包工作中,做好提前介入工作。 招标数据查询 中机采招网庞大招标数据信息,可为用户提供历史招标数据,统计、导出、分析提供相关数据支持。 中标数据查询 中机采招网庞大中标数据信息,可为用户提供历史中标数据,内容包含采购单位、中标单位、中标金额等,对用户的数据统计、导出、分析提供相关数据支持。 项目导出 用户可针对中机采招网项目库中所感兴趣的项目,按地区和时间进行分别汇总,并导出保存在本地电脑上进行存档备案。 数据库 (招标) 根据用户需求,以表格形式汇总近一个月内各行业、各领域招标采购数据信息,为用户做数据分析提供支持服务。 数据库 (中标) 根据用户需求,以表格形式汇总近一个月内各行业、各领域中标数据信息,为用户做数据分析提供支持服务。 数据库 (企业) 供包含业主、招标代理机构及相关单位、供应商、政府采购中心等企业数据库在线查询服务。
Python网络爬虫可以分为以下几个步骤: 1. Python基础知识:掌握Python的基本语法、变量、数据类型、函数、模块、文件操作等知识。 2. 习HTTP协议和HTML语言:了解HTTP协议和HTML语言的基本知识,包括HTTP请求和响应、HTML标签和结构等。 3. 爬虫框架和库:习使用Python中的爬虫框架和库,如requests、Beautiful Soup、Scrapy等。 4. 爬取网页数据:通过爬虫框架和库,编写Python脚本实现爬取网页数据的功能,如获取网页源代码、解析HTML结构、提取数据等。 5. 存储和处理数据:将爬取到的数据存储到本地文件或数据库中,并进行数据处理和分析。 以下是具体的习步骤: Step 1:Python基础知识 推荐习资料:《Python编程快速上手》、《Python基础教程》等。 Step 2:习HTTP协议和HTML语言 推荐习资料:《图解HTTP》、《HTML和CSS设计和构建网站》等。 Step 3:爬虫框架和库 推荐习资料:官方文档、《Python爬虫开发与项目实战》等。 Step 4:爬取网页数据 以爬取豆瓣电影Top250为例,以下是一个简单的Python爬虫: ```python import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/top250' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') movies = soup.find_all('div', class_='hd') for movie in movies: print(movie.a.span.text) ``` 该爬虫使用requests库发送HTTP请求,使用Beautiful Soup库解析HTML结构,获取豆瓣电影Top250的电影名。 Step 5:存储和处理数据 可使用Python内置的文件操作函数或第三方库如pandas、numpy等对爬取到的数据进行存储和处理。 以上是从零开始Python网络爬虫的基本步骤,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值