利用国庆8天假期,从头开始学爬虫,现在分享一下自己项目过程。
技术思路:
1,使用scrapy爬去证监会反馈意见
- 分析网址特点,并利用scrapy shell测试选择器
- 加载代理服务器:IP池
- 模拟浏览器:user-agent
- 编写pipeitem,将数据写入数据库中
2,安装并配置mysql
- 安装pymysql
- 参考mysql手册,建立数据库以及表格
3,利用进行数据分析
- 使用对反馈意见进行整理
- 利用jieba库进行分析,制作财务报表专用字典,获取词汇以及其频率
- 使用pandas分析数据并作图
- 使用tableau作图
分析思路:
- 分析公司名字是否含有地域信息
- 分析反馈意见的主要焦点:财务与法律
核心代码:
- 爬虫核心代码
# -*- coding: utf-8 -*- import scrapy from scrapy.selector import Selector from fkyj.items import FkyjItem import urllib.request from scrapy.http import HtmlResponse from scrapy.selector import HtmlXPathSelector def gen_url_indexpage():
#证监会的网站是通过javascript生成的,因此网址无法提取,必须是自己生成 pre = "http://www.csrc.gov.cn/pub/newsite/fxjgb/scgkfxfkyj/index" url_list = [] for i in range(25): if i ==0: url = pre+".html" url_list.append(url) else: url = pre+"_"+str(i)+".html" url_list.append(url) return url_list class Spider1Spider(scrapy.Spider): name = 'spider1' allowed_domains = ['http://www.csrc.gov.cn'] start_urls = gen_url_indexpage() def parse(self, response): item = FkyjItem() page_lst = response.xpath('//ul[@id="myul"]/li/a/@href').extract() name_lst = response.xpath('//ul[@id="myul"]/li/a/@title').extract() date_lst= response.xpath('//ul[@id="myul"]/li/span/text()').extract() for i in range(len(name_lst)): item["name"] = name_lst[i] item["date"] = date_lst[i] url_page = "http://www.csrc.gov.cn/pub/newsite/fxjgb/scgkfxfkyj" +page_lst[i] pre_final = "http://www.csrc.gov.cn/pub/newsite/fxjgb/scgkfxfkyj/" + page_lst[i].split("/")[1] res = Selector(text= urllib.request.urlopen(url_page).read().decode("utf-8")) #给res装上HtmlXPathSelector url_extract = res.xpath("//script").re(r'<a href="(\./P\d+?\.docx?)">|<a href="(\./P\d+?\.pdf)">')[0][1:] url_final = pre_final+ url_extract print ("-"*10,url_final,"-"*10) item["content"] = "" try: file =urllib.request.urlopen(url_final).read() filepath = r"C:\\Users\\tc\\fkyj\\fkyj\\files\\" filetype = url_extract.split(".")[1] with open(filepath+item["name"]+"."+filetype,'wb') as f: f.write(file) except urllib.request.HTTPError: item["content"] = "wrong:HTTPERROR" yield item
这里不足之处在于没有体现针对不同网站书写不同代码,建议建立不同callback函数
建议思路:
parse():正对初始网址
parse_page:针对导航页
parse_item:提取公司名称与日期
parse_doc:提取doc文档
---------------------------------------------------------------------pipeitem代码-------------------------------------------------------------
import pymysql
class FkyjPipeline(object):
def __init__(self):
#连接数据库
self.con = pymysql.connect(host='localhost', port=3306, user='root', passwd="密码",db="数据库名字")
def process_item(self, item, spider):
name = item["name"]
date = item["date"]
content = item["content"]
self.con.query("Insert Into zjh_fkyj.fkyj(name,date_fk,content) Values('" + name + "','" + date + "','"+content+"')")
#必须要提交,否则没用
self.con.commit()
return item
def close_spider(self):
#在运行时关闭数据库
self.con.close()
2,分析用代码–主要部分
一下代码在jupyter notebook上运行
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/31464