记第一次爬虫 python3.6+pyquery

爬取深市上市公司信息

从安装python开始最基本的语法到开始在网上爬取信息才过去一周,好多东西还没有系统的学习,没有太深的见解,还需继续努力。

1. 开发环境的配置

所安装的python版本是3.6,关于各种库的安装,参考了《Python3网络爬虫开发实战》。
所涉及的库:

  • Selenium
    其是自动化测试工具,可以实现驱动浏览器执行特定动作。
    下载地址

  • Chrome 谷歌浏览器(现在的chromedriver可以支持到69版本)

  • ChromeDriver
    chromeDriver下载地址
    找到浏览器对应的版本下载,解压后将chromedriver.exe 移动到Python 安装目录下的Scripts 目录下。

  • pyquery 网页解析工具,pip install pyquery 即可
    对于数据的存储采用的是将数据存放到.csv 文件中。

2. 所爬网址分析

对于上市公司的信息,证监局制定了几个网站,我采用的是巨潮资讯网址主要是为了学习初步简单的爬虫,也可以用其他的网站。这个网页的信息是公司代码和名称的列表。
这里写图片描述
我的思路是先试着爬取这个页面下800多个公司的信息,得到了这些公司的代码(000001),再去右上方的位置输入并搜索。最后发现
搜索之后的网址是:http://www.cninfo.com.cn/cninfo-new/snapshot/companyDetailCn?code=000001,发现所有的公司信息页面的Url只是最后的code=? 不同,所以可以拿着代码分别去展示公司信息的页面爬取。

from selenium import webdriver
from pyquery import  PyQuery as pq
from  selenium.webdriver.support.wait import  WebDriverWait
from  selenium.webdriver.support import  expected_conditions as EC
from  selenium.webdriver.common.by import By
import csv
browser = webdriver.Chrome()

wait =WebDriverWait(browser, 3) #等待时间
def id_get():
    # 中国证监会网址首页
    browser.get('http://www.cninfo.com.cn/cninfo-new/snapshot/companyListCn')


# 从网页中爬出来 上市公司代码 和公司名 存到csv中
    doc = pq(browser.page_source)

    item = doc('.company-list')
    lis= item.children()
    #print(lis)
    #获取信息

    with open('data.csv', 'w', encoding='utf-8', newline='') as csvfile:
        writer=csv.writer(csvfile)
        writer.writerow(['id', 'name'])
        for tag in lis.items():
            print(len(tag.text()))
            str1,str2 = str(tag.text()).split('\xa0')
            #print(str[0:6])
            writer.writerow([str1, str2])

doc中参数是根据网页的代码,所要爬取的信息在ul class=”“company-list>li…/li><.ul 中。

3. 信息的存取


信息页面
可以看到,公司的成立日期,邮箱等等都在table 中,类似的直接定位到 tr class=“evenrowcolor” 上,

def info_get(id):

    print('正在爬取公司的代码是:', id)
    #输入代码查询网页
    try:
        purl = 'http://www.cninfo.com.cn/cninfo-new/snapshot/companyDetailCn?code='+id
        browser.get(purl)

        wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.cn'))
        )
        #定位节点
        '''input = browser.find_element_by_id('hdy-input')
                                input.send_keys('000001')

                                button = browser.find_element_by_class_name('search-button')
                                button.click()'''
        doc = pq(browser.page_source)

        # 获取公司名
        name = doc('.middle-name')

        #print(name.text())

        # 定位到td所在点
        information = doc('.evenrowcolor .text-align-left')
        # 成立日期 邮箱 网址 电话
        date = information.eq(1)
        mail = information .eq(3)
        internet = information.eq(5)
        phone = information.eq(7)

        info2 = doc('.oddrowcolor .text-align-left')
        address = info2.eq(5)

       # 存入文件和爬取id时相似print(name.text(), date.text(), mail.text(), internet.text(),  phone.text(), address.text())

    except TimeoutError:
        info_get(id)

所注意的是,class=“evenrowcolor” 不是只有一个标签,所以首先定位到 这些td上,并且 成立日期,1987/12/22 这两个标签都不能直接区分出来,所以用date = information.eq(1) 来选择所需的节点。

正在爬取公司的代码是: 000001
平安银行股份有限公司 1987/12/22 pabdsh@pingan.com.cn www.bank.pingan.com (+86)755-82080386 广东省深圳市罗湖区深南东路5047号
正在爬取公司的代码是: 000002
万科企业股份有限公司 1984/05/30 IR@vanke.com www.vanke.com (+86)755-25531696 广东省深圳市盐田区大梅沙环梅路33号万科中心
正在爬取公司的代码是: 000006
深圳市振业(集团)股份有限公司 1989/04/01 szzygp@126.com www.zhenye.com (+86)755-25863012 广东省深圳市罗湖区宝安南路2014号振业大厦B座11-17层
正在爬取公司的代码是: 000008
神州高铁技术股份有限公司 1989/10/11 houxiaojing@vip.163.com www.shenzhou-gaotie.com (+86)10-56500561 北京市海淀区高梁桥斜街59号院1号楼161606
正在爬取公司的代码是: 000009
中国宝安集团股份有限公司 1983/07/06 zgbajt@163.net www.chinabaoan.com (+86)0755-251703000755-25170367 广东省深圳市笋岗东路1002号宝安广场A座28-29层
正在爬取公司的代码是: 000011

问题:虽然很简单,但对于库的使用不够熟练,并且这个网页的节点并不是都有id或class来区分它们,需遍历相同的节点。在代码中经常print出当前所定位的网页代码可以帮助你更快的找到正确的节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值