python+selenium+pyquery实现数据爬虫

2020-12-01 10:49:05 浏览数 (1)

提前声明一下,我写这个代码只是为了个人方便,读者切勿用作非法或者商业用途使用。

目标:

首先我们本次爬虫的任务是完成某采购网站的信息爬取,省去人工耗费的时间。快速筛选出我们的需要的指定信息。然后将招标信息的标题、链接、和时间找出来,并保存到Excel。

工具:

  • python3
  • chrom浏览器及dirver驱动
  • mysql
  • pyquery、selenium、等库的了解

思路:

当我们完成上述的准备工作之后就是研究目标网站的结构了。通过简单的点击查看等操作,我们发现这个网站是一个动态网站,对应的内容都是javascript来动态加载的,普通的requests肯定不能获取到随时变化的内容了。所以我们选择selenium工具来模仿人的点击操作,获取网页源码,然后

提取出对应的信息了。

话不多说,直接看代码:

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Time : 2020-11-08 15:50
# @Author : Administrator


import xlwt, re
from time import sleep
from selenium import webdriver
from pyquery import PyQuery as pq
from urllib import parse
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from lxml import etree

adder = input('请输入要爬取的区域名称,如:xx市,确保在网站的范围内:')
shuru_title = input('请输入需要查询的标题:n(如不需要筛选则直接敲击回车键开始抓取)n')
chrome_options = Options()
# chrome_options.add_argument("--headless")  # 无头chrome 不打开浏览器进行模拟点击
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
browser = webdriver.Chrome(options=chrome_options)
# browser = webdriver.Chrome()
all_info_list = []  # 定义一个空列表,用来存储爬虫数据


def crawle():
    url = 'http://www.gdgpo.gov.cn/queryMoreInfoList/channelCode/0005.html'
    browser.get(url=url)
    browser.maximize_window()
    sleep(2)
    # 打开网页后,点击对应城市的标签,然后异步加载的内容进行加载。
    if adder != '':
        browser.find_element_by_link_text(adder).click()
    # 这块由于代码自动操作太快,有时出现内容没更新的情况,所以我们等待两秒
    sleep(1)
    #  公告类型:全部
    # gg_type = browser.find_element_by_id('noticeTypeChannelSel')
    # gg_type.find_element_by_xpath('//*[@id="noticeTypeChannelSel"]/option[1]').click()
    #  公共类型:采购
    browser.find_element_by_xpath('//*[@id="contianer"]/div[3]/div[1]/div[2]/ul[1]/li[1]/a').click()
    sleep(1)
    # 定位标题
    title = browser.find_element_by_class_name('n_m_s_text2')
    # title.send_keys('医疗')
    title.send_keys(shuru_title)
    sleep(1)
    # 查询
    sea_button = browser.find_element_by_xpath('//*[@id="searchForm"]/table/tbody/tr[5]/td[2]/input[1]')
    sea_button.click()
    sleep(1)


# 该函数完成单页内容的采集输出
def get_onepage(html):
    html = pq(html)
    a = adder
    lists = html('.m_m_cont ul li').items()
    for list in lists:
        if adder != '':
            # b = list('li > span a').text()  # 使用pyquery的伪类用法查找第二个元素内的名字
            # if b == a:  # 对比分析,如果和我们输入的区域名字相同,则打印出来
            title = list('li > a').attr('title')
            print(title)
            ul = list('li > a').attr('href')
            base_url = 'http://www.gdgpo.gov.cn'
            URL = parse.urljoin(base_url, ul)
            print(URL)
            date = list('li > em').text()
            print(date)
            info_list = [title, URL, date]
            all_info_list.append(info_list)
            save_excel(title, URL, date)
        else:
            print('爬取数据失败!')


# 上面完成单页信息的采集,现在进行前五页的信息采集。
def get_page():
    for i in range(1, get_pages()):
        print('开始抓取第%s页'%i)
        # 由于第一页不用点击操作我们从第二页开始进行点击操作
        if i > 1:
            browser.find_element_by_link_text(str(i)).click()
            # 这块停顿两秒,让页面内容顺利加载出来
            sleep(2)
        html = browser.page_source
        get_onepage(html)
        print('抓取第%s页完毕'%i)
    browser.close()

# 获取总页面数
def get_pages():
    html = browser.page_source
    html = pq(html)
    pages = html('.m_m_c_page form').items()
    for page in pages:
        page = page('form > font').text()  # 获取总记录数  page:str
        page_n = int(page) / 15     #  获取有几页
        print(page_n)
        if page_n != 0:
            page_n = int(page_n)
            page_n  = 2
            print(page_n)
            return page_n
        elif page_n == 0:
            page_n  = 1
            print(page_n)
            return page_n
        else:
            page_n = int(page_n)
            page_n  = 2
            print(page_n)
            return page_n


#  创建Excel表并写入数据
def save_excel(title, URL, date):
    book = xlwt.Workbook(encoding='utf-8')
    sheet = book.add_sheet(adder   shuru_title   '相关资讯')
    head = ['标题', '链接', '时间']  # 表头
    sheet.col(0).width = 256 * 20  # Set the column width
    sheet.col(2).width = 8888  # Set the column width
    for h in range(len(head)):
        sheet.write(0, h, head[h])  # 写入表头
    i = 1
    for list in all_info_list:
        j = 0
        for data in list:
            sheet.write(i, j, data)
            j  = 1
        i  = 1
    book.save(r'C:/Users/Administrator/Desktop/PrntSrc/Gov_procurement.xls')  # 存入所有信息后,保存为filename.xlsx


def main():
    print('开始执行爬虫')
    crawle()
    get_page()
    print('爬虫执行完毕')

main()

运行效果:

声明:

代码虽烂,但请读者切勿用作非法用途,后果自负。

0 人点赞