技术标签: python 可视化 数据分析 爬取天眼查 Scrapy框架爬虫 scrapy
url = 'http://www.tianyancha.com/'
1.可以看到主页有显示的热门公司,直观的看有22个,查看源码,查看其页面的跳转连接:
2.可以很轻松的找到整体的热门公司的跳转链接都封装在class为keys下的a标签中
3.随机点击进入某一个热门公司的页面
4.可以看到,页面的最上端显示的是公司的名称,电话,邮箱,地址等基本信息,下端具体显示了公司的注册资本,法人等详细的信息,我想将这些信息全部提取,并存入数据库当中,以便可以更好的进行数据的提取和可视化,需要查看这些信息的源码的位置,F12:
对于公司的基本信息,存放的方式大都是按指定给的标签的形式存放的,但对于公司的详细信息,可以很明显的看出是存放在表格当中的,这也方便了爬虫时候对于该部分信息的提取。
scrapy startproject tianyancha
使用pycharm打开刚才创建的Scrapy项目,在Terminal中输入创建的命令:
scrapy genspider -t crawl tianyan www.tianyancha.com
class TianyanchaItem(scrapy.Item):
image_url = Field()
company_name = Field()
html_url = Field()
company_phone = Field()
company_mailbox = Field()
company_url = Field()
company_address = Field()
company_introdution = Field()
company_boss_name = Field()
company_info = Field()
class TianyanSpider(CrawlSpider):
name = 'tianyan'
allowed_domains = ['www.tianyancha.com']
start_urls = ['http://www.tianyancha.com/']
# 设置爬取的速度,最简单的反爬
# 这里的爬取速度指的完成一个item的时间,即从下载,爬取,显示保存,整体的时间为3秒
custom_settings = {
'DOWNLOAD_DELAY':3
}
# 直接使用xpath定位热门公司页面的跳转链接
rules = (
Rule(LinkExtractor(restrict_xpaths='//div[@class="keys"]//a'), callback='parse_item'),
)
# 使用xpath对信息进行提取
def parse_item(self, response):
item = TianyanchaItem()
item['company_name'] = ''.join(response.xpath('//h1[@class="name"]//text()').extract())
item['image_url'] = response.xpath('//img[@class="img"]//@src').extract()
item['company_phone'] = response.xpath('//span[@class="link-hover-click"]//text()').extract()
item['company_mailbox'] = response.xpath('//span[@class="email"]//text()').extract()
item['company_url'] = response.xpath('//a[@class="company-link"]//@href').extract()
item['company_address'] = response.xpath('//script[@id="company_base_info_address"]/text()').extract()
item['company_introdution'] = response.xpath('//div[@class="auto-folder"]/div/text()').extract()[2]
item['company_boss_name'] = response.xpath('//div[@class="name"]/a/text()').extract()
item['company_info'] = ''.join(response.xpath('//table[@class="table -striped-col -border-top-none -breakall"]//td//text()').extract())
item['html_url'] = response.url
#item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
#item['name'] = response.xpath('//div[@id="name"]').get()
#item['description'] = response.xpath('//div[@id="description"]').get()
return item
这里需要注意的是,我选择的保存方式是mysql数据库,并将公司的名字作为主键,而数据库中保存数据的时候,只有string类型才能正确插入到数据中,但对于table类型的数据爬取下来的时候,他每个是分开的,属于list类型,存放不到数据库中,会报如下的错误:
所以这里将主键和公司的info介绍数据使用"".join()进行转换,变为string类型,但这对于数据分析和数据的阅读带来了不好的麻烦。
class PyMySqlPipeline(object):
def __init__(self):
self.connect = pymysql.connect(
host = 'localhost',
database = 'tianyancha',
user = 'root',
password = '123456',
charset = 'utf8',
port = 3306,
)
# 创建游标对象
self.cursor = self.connect.cursor()
def process_item(self, item, spider):
cursor = self.cursor
sql = 'insert into hot_company(company_name,company_phone,company_mailbox,company_url,company_address,company_introdution,company_boss_name,company_info,image_url,html_url) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
cursor.execute(sql,(
item['company_name'],item['company_phone'],item['company_mailbox'],item['company_url'],item['company_address'],item['company_introdution'],item['company_boss_name'],item['company_info'],item['image_url'],item['html_url']
))
# 提交数据库事务
self.connect.commit()
return item
设置完之后一定要记得在settings.py中开启管道
我没有进行登陆,只是简单的打开首页中热门公司的链接,并将其对应的信息爬取下来,在实际的代码过程中,仅仅更换user-agent,将ROBOTSTXT_OBEY设置为False,是可以进行爬取的,但当我再次爬取的时候,返回的热门公司的链接全部都被重定向,重定向为登陆的界面。若想再次在首页打开热门公司的链接只需等待两三个小时或者更短的时间,刷新页面即可再次打开。
再次进行爬取的时候,我做了如下的事情:
1.关闭cookies信息:
COOKIES_ENABLED = False
2.设置随机请求的头部
class RandomUserAgentMiddleware():
def __init__(self):
self.user_agenrs = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
]
def process_request(self,request,spider):
request.headers['User-Agent'] = random.choice(self.user_agenrs)
DEFAULT_REQUEST_HEADERS = {
'Accept': '*',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36',
}
4.设置每个item的爬取速度
# 设置爬取的速度
custom_settings = {
'DOWNLOAD_DELAY':3
}
单位(万人民币)
单位(万美元)
生成美的公司简介的词云图
当然还可以做其它数据的可视化。
代码示例:sklearn.metrics.auc函数的输入是FPR和TPR的值,即ROC曲线中的真阳性率(true positive rate)和假阳性率(false positive rate)。得到的输出结果是一个float格式的数值,代指ROC曲线下的面积(AUC的值)。python所给的代码示例中用到了metrics.roc_curve函数,这个函数主要是用来计算ROC曲线面积的;在这里的输入参数有三个:第一个参数是一个二进制数组y,代表“真”或“假”,默认为0或者1的.
1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。 在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。
无法获取到aapt2-3.2.1-4818917.pom资源org.gradle.api.internal.tasks.TaskDependencyResolveException: Could not determine the dependencies of task ':app:processBmwintDebugResources'. at org.gradle.api.inter...
log4j2异步日志配置方式 使用异步日志时加入Log4j-2.9 and higher require disruptor-3.3.4.jar or higher on the classpath 使用springboot的话 <dependency> <g...
手机端IOS系统微信中虚拟键盘遮挡input输入框问题解决方案
solr分片shard对应的range值变为null异常问题处理选 用的solr是solr4.7版本!solr分片突然发现多个collections上某些shard对应的range值变为null,而且还多一个parent:null
题目描述下面是一个平面上的点的类定义,请在类外实现它的所有方法,并生成点测试它。输入测试数据的组数 t第一组测试数据点p1的x坐标 第一组测试数据点p1的y坐标 第一组测试数据点p2的x坐标 第一组测试数据点p2的y坐标…输出输出p1到p2的距离在C++中,输出指定精度的参考代码如下:#include #include //必须包含这个头文件using namespace std;void main( ){ double a =3.141596;cout<&l
MyBatis从入门到最后会讲解的内容:基础知识(重点,内容量多)对原生态jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理 (掌握)mybatis入门程序 用户的增、删、改、查mybatis开发dao两种方法: 原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握) mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)
工作需要用到C++中的正则表达式,所以就研究了以上三种正则。一、三种正则的比较1. C regex/* write by xingming * time:2012年10月19日15:51:53 * for: test regex * */#include <regex.h>#include <iostream>#include <sys/types.h>#include <s
基于corosync+pacemaker的高可用集群 Pacemaker即Cluster Resource Manager (简称CRM),用来管理整个HA的控制中心,客户端通过pacemaker来配置管理监控整个集群。它不能提供底层心跳信息传递的功能,它要想与对方节点通信需要借助底层(新拆分的heartbeat或corosync)的心跳传递服务,将信息通告给对方。...
给定一个非负整数numRows,生成杨辉三角的前numRows行在杨辉三角中,每个数是它左上方和右上方的数的和 Example:Input: 5Output:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]1:根据numRows的大小简单迭代def generate(self, num...
字符串可以干什么?字符串使用频率特别特别的频繁,基本每次写代码都得使用到,比如读取到的文本文件赋值给字符串,然后在使用字符串去分析拿到想要的内容,接收用户输入的内容等,拿到内容我们就可以使用他里面的方法对字符串进行分析了。Split(过滤字符):这个方法就是把我们不需要的信息给过滤掉,例如:“小aa马哥c的棺b材板”;把文中所有的abc给过滤掉,有点类似于正则表达式,注意:a.Split()括号是char类型的参数哦,返回string类型字符串string a = “小aa马哥c的棺b材板