Python3爬取企查查网站的企业年表并存入MySQL
本篇博客的主要内容:爬取企查查网站的企业年报数据,存到mysql中,为了方便记录,分成两个模块来写:
第一个模块是爬取数据+解析数据,并将数据存到文件中;第二个模块是将数据存到mysql数据库中(批量插入)
第一部分:爬取数据+解析数据
需要的库文件:
import pymysql
import requests
from bs4 import BeautifulSoup
import codecs
import time
import sys
没有使用scrapy爬虫框架,帮同学爬取企查查上一些企业的信息。
爬虫前的准备(环境):
1.Python是必须的,基于python3写的
2.爬虫依赖的库文件
3.MySQL必须有,同时还要有Python操作MySQL的库文件pymysql
(注:Python3中不支持MySQLdb库文件,一开始并不知道,就傻傻地pip了,pip报错,以为是网络的问题或者是window的问题,胡乱搞了一通之后,百度搜索了python mysql库文件安装,结果是其他人都是pip的,并没有啥问题,无奈之下在python后面加了3,然后看到python3不支持MySQLdb,整个人都傻逼了)
Coding之前,我们还需要先分析爬取网站的结构:
1.主要爬取的是企查查的企业年报,页面如下图:爬取的内容就是红色框中的几个表格(分年度的)。
以爬取 南京易乾宁金融信息咨询有限公司的企业年报为例
url:http://www.qichacha.com/firm_1aa73f4e4ba0e172143909a124f0cbb6.shtml#report
爬取的内容:
2.通过使用浏览器自带的开发者工具(审查元素),定位这几个表格在网页中的位置,如下所示:
从图中可以看出:企业基本信息在<table class="ntable"></table>中
Coding:
1. 网页结构和爬取需求分析完毕,接下来就是撸起袖子Coding
使用request库爬取(推荐使用request库,可以满足爬虫的绝大部分需求)。
使用beautifulsoup4来解析网页,bs4库我就不多说了,只要是用过Python写爬虫的人,都说好。对于初学者,可以查看bs4的官方文档(传送地址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/)。
先简单使用request将网页下载下来,然后使用beautifulsoup4来解析网页内容,来验证是否和之前分析的结果一样。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import lxml
from bs4 import BeautifulSoup
import codecs
import time
import sys
headers = {
'Accept': 'text/html, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Host': 'www.qichacha.com',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Cache-Control': 'max-age=0',
'Cookie': 'UM_distinctid=162b82f21fa8f1-0803268b01ee0f-7c117d7e-1fa400-162b82f21fb77c; acw_tc=AQAAAIsSAkpjKAAAq7DGOlIV8eQv2vCF; _uab_collina=152350856009288770740658; hasShow=1; _umdata=C234BF9D3AFA6FE719F2E09D797D23E34110F2E82EB4188B670C9EB8EC9DC9B349A81CD9A226A737CD43AD3E795C914CC2334F10781D1FBF6B6942E57AA6F7F8; PHPSESSID=fphni733iobptf39h3nkqrim96; zg_did=%7B%22did%22%3A%20%22162b82f2175390-079c7ce1a4a2ed-7c117d7e-1fa400-162b82f2176859%22%7D; CNZZDATA1254842228=595737747-1523503772-https%253A%252F%252Fwww.baidu.com%252F%7C1523841965; Hm_lvt_3456bee468c83cc63fb5147f119f1075=1523508520,1523515331,1523583111,1523618471; Hm_lpvt_3456bee468c83cc63fb5147f119f1075=1523844231; zg_de1d1a35bfa24ce29bbf2c7eb17e6c4f=%7B%22sid%22%3A%201523844141176%2C%22updated%22%3A%201523844235810%2C%22info%22%3A%201523508519291%2C%22superProperty%22%3A%20%22%7B%7D%22%2C%22platform%22%3A%20%22%7B%7D%22%2C%22utm%22%3A%20%22%7B%7D%22%2C%22referrerDomain%22%3A%20%22www.qichacha.com%22%2C%22cuid%22%3A%20%2299d640975c5ff0e372e5283151adbfd0%22%7D',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400'
}
'''
企业基本信息表(分年)
股东(发起人)出资信息表
企业资产状况信息表
股权变更信息表
'''
if __name__ == '__main__':
print("爬虫启动....")
url = 'http://www.qichacha.com/firm_1aa73f4e4ba0e172143909a124f0cbb6.shtml#report'
try:
# 爬取的网页地址:南京易乾宁金融信息咨询有限公司的企业年报
reqs = requests.get(url, headers=headers, timeout=30)
# print(reqs.text)
soup = BeautifulSoup(reqs.text, 'lxml')
# print(soup)
print("#########################")
report_div = soup.find('div', class_='container m-t-md').find('div', class_="data_div", id='report_div')
print(report_div)
print(report_div.find('section', class_='panel pos-rlt b-a report_info'))
except:
error = sys.exc_info()
print('{0} -> {1} -> {2}'.format(url, error[0], error[1]))
# print(error[0], end=' ')
# print(error[1])
# 出现异常了,咋办
print("爬虫结束....")

会发现结果返回为空,这是为什么呢?使用开发者工具查看的时候,在网页中是存在的。再次分析网页:
下图中的细线框中,在使用上面代码爬取数据的时候返回的是空的div,div里面的内容(粗红线框)却不翼而飞。
一筹莫展之际,突然想到了,之前在做爬虫的时候,遇到过数据和页面分开发送的情况:重新整理下思路,发现在点击企业年报的时候,页面的其他内容并没有变化,变化的只有企业年报部分,这个网站应该使用的是Ajax,异步载入需要的数据。在实际爬取的时候,应该去请求另一个网址,得到数据。
使用浏览器的开发者工具,点击network选项,在进入到企业基本信息页面之后,清空network中所有的信息,然后点击企业年报,逐条查看network的信息,发现有一条url的response中返回了数据,经过对这些数据仔细的分析,发现这就是我需要爬取的数据。(注:数据与页面分离,仔细想一想,网页这么做才是正解,如果一次性将企业的所有数据发送过来,不仅耗费网络资源,还需要额外的代码处理这些数据存放)
2. 经过上面的分析之后,改写之前的code:
具体怎么使用beautifulsoup4去解析这里面的数据很简单,我就不在这里细说了,如果有不懂的,看一看文档基本上就会了。
爬取+解析的详细代码实现:(我这里是爬取了17个企业的数据,企业不多,所以url我都固定了,如果要