- querylist真的挺好用的!!!感谢!!!参考链接:https://learnku.com/laravel/t/6262/querylist-4-concise-and-elegant-php-collection-tool
- 文档v4:http://querylist.cc/docs/guide/v4/example
- 记录几个rules,仅方便自己查看
$rules = [ 'p1' => ['#side > div.content.clearfix > div.content_left > div.centent_centent > p:nth-child(1)', 'text'], //文本,比如图片就会被过滤掉 'content' => ['#side > div.content.clearfix > div.content_left > div.centent_centent', 'html'], //HTML 包含标签等,图片会爬下来,类似富文本 'img' => ['#side > div.content.clearfix > div.content_left > div.centent_centent > p:nth-child(4) > img', 'src'], //图片的链接
'alt' => ['#side > div.content.clearfix > div.content_left > div.centent_centent > p:nth-child(4) > img', 'alt'], //img 的 alt
'a' => ['h3>a', 'href']; //a 标签的href 链接];
- 简单记录一下在爬取数据保存数据的过程中遇到的头疼的问题,问题是:爬取到的数据是乱码的(数据content是富文本,包含标签的),然后我想着使用header('Content-Type: *; charset=utf-8'); 设置字符集,数据是爬到了,但是保存到数据库却是空的(成功保存了,但内容为空)。不知道是什么原因,是因为字符编码的原因导致mysql不能 保存数据 还是因为别的原因,我到现在也还没找到根源。(自己太菜了-_-#)。我一步一步排错,(1)打印数据是有内容的(2)打印SQL语句在命令行执行,也成功了(数据库保存了正常的数据)。(3)PDO,mysqli都尝试了(都成功地向数据库插入了空值)。(4)我还一度尝试SQL语句的单引号、双引号更改,然并卵----------我也是醉了。。。。。后来看到iconv,又尝试iconv (没办法的时候,就是不断的尝试各种可能)。发现成功了。虽然成功了,但是不知道什么原因 #_- | -_# 猜测是因为mysql有着字符编码的限制吧。反正爬虫的时候不要用header 设置字符编码,应该使用iconv 来转换字符编码。就能够正常保存到数据库。
1 <?php 2 3 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 4 // 驾照资讯内容爬取url:http://www.jsyst.cn/ksjq/km1/index.asp?page=7 // 5 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 6 7 require '../querylist_spider/vendor/autoload.php'; 8 9 10 use QL\QueryList; 11 12 //header('Content-Type: *; charset=gb2312'); //我开启这个之后,爬取的数据无法保存到数据库,找了一天的bug,没找到问题,第二天换了一个转码方式,iconv() 成功保存了。心里真的有一万只草拟马,同时感到自己真的是太菜了,#-_-# 13 14 // $page = [1, 2, 3, 4, 5, 6, 7, 8]; 15 $page = [1, 2]; 16 // 获取a标签的内容以及url 17 foreach ($page as $key => $value) { 18 $aUrl[] = 'http://www.jsyst.cn/ksjq/km1/index.asp?page='.$value; 19 } 20 21 for ($i = 1; $i <= 10; $i++) { 22 $rule[$i]['title'] = ["#side > div.content.clearfix > div.content_left > div > p:nth-child({$i}) > a", 'text']; 23 $rule[$i]['url'] = ["#side > div.content.clearfix > div.content_left > div > p:nth-child({$i}) > a", 'href']; // 要爬取的详情页的url 24 } 25 26 foreach ($aUrl as $key => $value) { 27 foreach ($rule as $k => $v) { 28 $list[] = QueryList::rules($v)->get($value)->query()->getData()->all(); 29 } 30 } 31 32 // print_r($list); exit('list exit code'); 33 34 $rules = [ 35 //'p1' => ['#side > div.content.clearfix > div.content_left > div.centent_centent > p:nth-child(1)', 'text'], 36 'content' => ['#side > div.content.clearfix > div.content_left > div.centent_centent', 'html'], 37 //'img' => ['#side > div.content.clearfix > div.content_left > div.centent_centent > p:nth-child(16) > img', 'alt'], 38 ]; 39 40 foreach ($list as $key => $value) { 41 $data[$key]['content'] = QueryList::rules($rules)->get($value[0]['url'])->query()->getData()->all()[0]['content']; 42 $data[$key]['title'] = $value[0]['title']; 43 if ($key == 5) { 44 break; 45 } 46 } 47 48 // file_put_contents('./data.txt', var_export($data, true)); 49 // print_r($data); 50 // exit; 51 52 // 插入数据库 53 54 $link = mysqli_connect('localhost', 'root', 'root', 'count') or exit('链接数据库失败'); 55 //$link->query('set charset=utf8'); 56 57 $addtime = $updatetime = time(); 58 foreach ($data as $key => $value) { 59 $title = iconv('gb2312', 'utf-8', $value['title']); 60 $content = iconv('gb2312', 'utf-8', $value['content']); 61 62 $sql = 'INSERT INTO drive_cheats (title, content, addtime, updatetime) VALUES (\''.$title.'\', \''.$content.'\', \''.$addtime.'\', \''.$updatetime.'\'); '; 63 // echo $sql;exit; 64 $res = mysqli_query($link, $sql); 65 if (!$res) { 66 echo mysqli_error($link); 67 } else { 68 // echo '<font color="red">success</font>'; 69 // echo mysqli_info($link); 70 echo mysqli_insert_id($link); 71 } 72 echo $sql; 73 } 74 75 mysqli_close($link);
View Code
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:querylist爬取页面内容rules记录以及爬虫字符编码的问题 - Python技术站