记一次爬虫经历

一个同学想要提取某网站的数据,然后导出为excel。

刚开始,我在网上找了一个php生成excel的demo,名字叫PHPExcel

刚开始我是直接从那个网站上读数据,然后利用那个demo导出为excel,但是遇到了一个特别坑的问题——

那个网站服务器实在太差了,我要从那里读1400多个网页的内容,经常出现读取失败的问题,然后程序就进行不下去了。

于是,想到办法1:

每次读取5页数据,最后可以生成大概1400/5个表。

这样每次读取失败,再重新运行程序读取。

但是有可以改进的地方——

那个网站一次读取失败,可以重复读取几次,99%是能读取成功的。

之后想到,数据库有导出excel的方法,于是乎,我先把数据存入数据库,最后一下子导出为excel。

<?php
//避免程序运行30秒后停止
ini_set(‘max_execution_time‘, ‘0‘);
header("content-Type: text/html; charset=utf8");

//连接数据库
$conn=mysql_connect("localhost","root","")or die("连接错误");
mysql_select_db("newdb",$conn);
mysql_query("set names ‘utf8‘");

//读取网页超时时间
$opts = array(
  ‘http‘=>array(
    ‘method‘=>"GET",
    ‘timeout‘=>15,//单位秒
   )
);

for($i = 1; $i<143; $i++)
{
	//读取超时后重新读网页内容,最多3次,否则数据出错
	$cnt1=0;
	while($cnt1<3 && ($strJson=file_get_contents("http://stockdata.stock.hexun.com/zrbg/data/zrbList.aspx?date=2014-12-31&count=20&page=".$i, false, stream_context_create($opts)))===FALSE)
		$cnt1++;
	$strJson = iconv("gb2312", "utf-8//IGNORE",$strJson);
	preg_match_all(‘/(?<=industry:\‘).+?(?=\‘,stockNumber)/‘, $strJson, $arrLala);		//获得所有企业名称
	preg_match_all(‘/(?<=StockNameLink:\‘).+?(?=\‘,industry)/‘, $strJson, $arrLala2);	//获得所有链接
	for($j = 0; $j <20; $j++)
	{
		$cnt=0;
		while($cnt<3 && ($str=file_get_contents("http://stockdata.stock.hexun.com/zrbg/".$arrLala2[0][$j], false, stream_context_create($opts)))===FALSE)
			$cnt++;
		$str = iconv("gb2312", "utf-8//IGNORE",$str);
		preg_match_all(‘/(?<=\().+?分/‘, $str, $arr);
		preg_match_all(‘/(?<=:).+?(?=<)/‘, $str, $arr2);

		$sql="insert into report(
		a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1,v1,w1,x1,y1,z1,
		a2,b2,c2,d2,e2,f2,g2,h2,i2,j2,k2,l2,m2,n2,o2,p2,q2,r2,s2,t2,u2,v2,w2,x2,y2,z2,
		a3,b3,c3,d3) values(‘".$arrLala[0][$j]."‘,‘".$arr[0][0]."‘,‘".$arr[0][1]."‘,‘".$arr2[0][5]."‘,‘".$arr2[0][6]."‘,‘".$arr2[0][7]."‘,‘".$arr2[0][8]."‘,‘".$arr2[0][9]."‘,‘".$arr2[0][10]."‘,‘".
			$arr[0][8]."‘,‘".$arr2[0][11]."‘,‘".$arr2[0][12]."‘,‘".$arr2[0][13]."‘,‘".$arr2[0][14]."‘,‘".$arr2[0][15]."‘,‘".
			$arr[0][14]."‘,‘".$arr2[0][16]."‘,‘".$arr2[0][17]."‘,‘".$arr2[0][18]."‘,‘".
			$arr[0][18]."‘,‘".$arr2[0][19]."‘,‘".
			$arr[0][20]."‘,‘".$arr2[0][20]."‘,‘".$arr2[0][21]."‘,‘".$arr2[0][22]."‘,‘".
			$arr[0][24]."‘,‘".$arr[0][25]."‘,‘".$arr2[0][23]."‘,‘".$arr2[0][24]."‘,‘".
			$arr[0][28]."‘,‘".$arr2[0][25]."‘,‘".$arr2[0][26]."‘,‘".
			$arr[0][31]."‘,‘".$arr2[0][27]."‘,‘".$arr2[0][28]."‘,‘".$arr2[0][29]."‘,‘".
			$arr[0][35]."‘,‘".$arr[0][36]."‘,‘".$arr2[0][30]."‘,‘".$arr2[0][31]."‘,‘".
			$arr[0][39]."‘,‘".$arr2[0][32]."‘,‘".
			$arr[0][41]."‘,‘".$arr2[0][33]."‘,‘".$arr2[0][34]."‘,‘".
			$arr[0][44]."‘,‘".$arr[0][45]."‘,‘".$arr2[0][35]."‘,‘".$arr2[0][36]."‘,‘".$arr2[0][37]."‘,‘".$arr2[0][38]."‘,‘".$arr2[0][39]."‘,‘".
			$arr[0][51]."‘,‘".$arr[0][52]."‘,‘".$arr2[0][40]."‘,‘".$arr2[0][41]."‘)";
		mysql_query($sql,$conn);
	}
}
echo "success!";
?>

  

如果有读取失败,或者读取错误的数据,那么重新读取更新数据库。

<?php
//避免程序运行30秒后停止
ini_set(‘max_execution_time‘, ‘0‘);
header("content-Type: text/html; charset=utf8");

//连接数据库
$conn=mysql_connect("localhost","root","")or die("连接错误");
mysql_select_db("newdb",$conn);
mysql_query("set names ‘utf8‘");

//读取网页超时时间
$opts = array(
  ‘http‘=>array(
    ‘method‘=>"GET",
    ‘timeout‘=>2,//单位秒
   )
);

$cnt=0;
while($cnt<3 && ($str=file_get_contents("http://stockdata.stock.hexun.com/zrbg/stock_bg.aspx?code=300256", false, stream_context_create($opts)))===FALSE)
{
	$cnt++;
	if($cnt<3)
		echo "Try to get contents again...<br>";
	else
		echo "Read failed!<br>";
}
$str = iconv("gb2312", "utf-8//IGNORE",$str);
preg_match_all(‘/(?<=\().+?分/‘, $str, $arr);
preg_match_all(‘/(?<=:).+?(?=<)/‘, $str, $arr2);

$sql = "update report set 	b1=‘".$arr[0][0]."‘,
							c1=‘".$arr[0][1]."‘,
							d1=‘".$arr2[0][5]."‘,
							e1=‘".$arr2[0][6]."‘,
							f1=‘".$arr2[0][7]."‘,
							g1=‘".$arr2[0][8]."‘,
							h1=‘".$arr2[0][9]."‘,
							i1=‘".$arr2[0][10]."‘,
							j1=‘".$arr[0][8]."‘,
							k1=‘".$arr2[0][11]."‘,
							l1=‘".$arr2[0][12]."‘,
							m1=‘".$arr2[0][13]."‘,
							n1=‘".$arr2[0][14]."‘,
							o1=‘".$arr2[0][15]."‘,
							p1=‘".$arr[0][14]."‘,
							q1=‘".$arr2[0][16]."‘,
							r1=‘".$arr2[0][17]."‘,
							s1=‘".$arr2[0][18]."‘,
							t1=‘".$arr[0][18]."‘,
							u1=‘".$arr2[0][19]."‘,
							v1=‘".$arr[0][20]."‘,
							w1=‘".$arr2[0][20]."‘,
							x1=‘".$arr2[0][21]."‘,
							y1=‘".$arr2[0][22]."‘,
							z1=‘".$arr[0][24]."‘,
							a2=‘".$arr[0][25]."‘,
							b2=‘".$arr2[0][23]."‘,
							c2=‘".$arr2[0][24]."‘,
							d2=‘".$arr[0][28]."‘,
							e2=‘".$arr2[0][25]."‘,
							f2=‘".$arr2[0][26]."‘,
							g2=‘".$arr[0][31]."‘,
							h2=‘".$arr2[0][27]."‘,
							i2=‘".$arr2[0][28]."‘,
							j2=‘".$arr2[0][29]."‘,
							k2=‘".$arr[0][35]."‘,
							l2=‘".$arr[0][36]."‘,
							m2=‘".$arr2[0][30]."‘,
							n2=‘".$arr2[0][31]."‘,
							o2=‘".$arr[0][39]."‘,
							p2=‘".$arr2[0][32]."‘,
							q2=‘".$arr[0][41]."‘,
							r2=‘".$arr2[0][33]."‘,
							s2=‘".$arr2[0][34]."‘,
							t2=‘".$arr[0][44]."‘,
							u2=‘".$arr[0][45]."‘,
							v2=‘".$arr2[0][35]."‘,
							w2=‘".$arr2[0][36]."‘,
							x2=‘".$arr2[0][37]."‘,
							y2=‘".$arr2[0][38]."‘,
							z2=‘".$arr2[0][39]."‘,
							a3=‘".$arr[0][51]."‘,
							b3=‘".$arr[0][51]."‘,
							c3=‘".$arr2[0][40]."‘,
							d3=‘".$arr[0][41]."‘
					where 	a1=‘星星科技(300256)‘";
mysql_query($sql,$conn);	

?>

  

时间: 2024-10-05 05:41:44

记一次爬虫经历的相关文章

scrapy写爬虫经历

scrapy写爬虫经历 前一段时间自己做项目参赛,用scrapy爬了许多网课平台的数据,当时没咋总结.最近又要搞事情,总结一下吧.有啥想法都会在次记录下来. 1. 安装,使用 ubuntu 1604 docker+mysql5.7 anaconda>python3.6 pycharm pip install scrapy 安装Scrapy 在pycharm新建一个项目,然后在终端输入: scrapy startproject companys 就会自动建立一个文件树.如下图: 2. 3. 4.

记一次爬虫框架的开发经历

爬虫是我看过的所有程序中最酷的,因为爬虫可以真正帮你完成一些费事繁琐的工作,比如搜集图片. 咳咳~因为某个网站会把图片打包成种子,发布,并且提供下载,对于老司机来说是省时省力的事情,但是种子是会失效的.有一些很想看的图集想看但是种子失效了,这时候会让人很尴尬,还好,种子没了但是官网图片还在!所以当时就想要是自己写一个爬虫去帮我完成这些另存为图片的工作就好了. 我是想也没想,自己开始筹划. 开始的第一步自然而然是收集一些网页的前端代码(也就是在浏览器里面右键->网页源代码里面查看).因为我要知道这

记大一大二经历以及教训

2017  5.10   我目前就读川大本科大二,第一篇文章,纯属个人的大学生活感想.   大一青涩,现在想来可以用无知形容,没找到笃定前行的方向,然而厌恶了现在的专业--风景园林.以下吐槽.此专业在我川真的是巨水,本身国内没多少开这个专业的,2012教育部学科评估排名倒数,在一个985院校里面的专业连个普通一本都比不上,可想而知教学质量和教学环境.何况这个专业挂名工科,实则是搞艺术的,数学物理一概不学,和工科不沾边,要我觉得不喜欢设计千万不要选这种专业,身边动辄就从小开始画画,素描水彩不在话下

职业生涯手记——记人生中第一次经历的产品上线——内测篇Day1

2017/08/11 产品内测期Day1 公司经过这几天的各种讨论会,终于订出了一个产品上线前内测活动方案,然后今天还算是顺利启动了,也可以算是可喜可贺: 临下班前,今天已经有79人申请内测,其中25人成功安装了APP. 作为我个人来讲,还真是人生中第一次参与内测,很难得的经历:而且公司里的高层和中层们以前都是做项目类型的,几乎都没有APP内测的经历呢. 今天一整天客服组的妹纸们真是忙,我就没见过她们站起来活动,甚至是喝水和上厕所,一定都在与内测用户解答问题呢.路过她们电脑前看到与用户的聊天记录

【转】记毕业季的求职经历

原文地址:http://www.cnblogs.com/chkkch/p/3401015.html        (mark一下,打基础做准备!) Accept的公司:Facebook, DeNA, SAP, Intel, ARMFail的公司:阿里巴巴,腾讯,百度,Google,微软,平安科技,豆瓣,雅虎,Amazon,NVIDIA,EMC,VMware,还有各种说不上名字的小公司 今年(确切的说是从去年暑假开始)的工作实在不好找.随着国内的经济形势下降,公司的招的人也随之下降得厉害.腾讯,阿

一次有趣的爬虫经历

学习了两天Python 3的urllib,想着自己爬点东西,就想到了日常用的翻译,选择了两款网页翻译,百度和有道,都看了看网页的结构,发现有道的挺有趣,就尝试着爬取有道翻译,期间也遇到了一些小问题,拿出来分享一下,下面是我爬取的过程. 本文参考https://blog.csdn.net/nunchakushuang/article/details/75294947,此文对于现在爬取有道翻译已经过时了,下面是本人新测试的代码 1.首先打开有道翻译,随便翻译点内容,查看请求头和回复体 分析请求头可以

[SPM_hw1]记一次项目经历

最近一次做的比较完整的项目开发是上学期末的web大作业. 项目的基本要求是做一个通缉犯管理系统.其中包括了可以对于用户进行操作的后台管理员部分,以及可以进行通缉信息查询和添加举报信息的前台界面.从项目开始到deadline大概有2周左右的时间.当然,由于仅仅是作为期末的大作业,并没有涉及到什么预算之类的问题,开发中涉及的技术都是通过网络进行学习以及搜索的. 开发中使用的语言是JAVA,IDE用的是Intellij IDEA,使用了java web开发的spring mvc框架,前台页面使用了bo

记一次性能优化经历

提到这次性能优化,好简单,仅仅是压缩了一下显示图片大小, 网页打开速度得到了显著的提升,抛砖引玉吧. 优化前 优化后: 在优化前,一次产品列表要显示12张图片,每张图片在600kb左右,也就是每打开一次当前页面需要传输7.2mb左右的图片文件,压缩后,每一张图片在12kb左右,每次传输200kb,由此可见,降低网络传输量,可以显著提升网页浏览速度,采用小图片,压缩css,压缩js,把js放到一个文件中,这些都是减少网络传输途径.

类型构造器-记一次悲惨经历,论我是如何用静态构造器来作死的

在写一个wp的论坛程序时,我定义了几个类.一个是管理类(即Manager),这个管理类不能被实例化,它管理着论坛的板块类型(PlateCategory)和板块(Plate)的集合,即 static PlatesManager() {       //…    private static ObservableCollection<PlateCategory> PlateCategories;         private static ObservableCollection<Plat