网站建设资讯

NEWS

网站建设资讯

如何用PHP采集知乎数据 PHP数据采集

php采集大数据的方案

1、建议你读写数据和下载图片分开,各用不同的进程完成。

创新互联公司秉承实现全网价值营销的理念,以专业定制企业官网,网站设计制作、做网站,小程序设计,网页设计制作,移动网站建设营销型网站建设帮助传统企业实现“互联网+”转型升级专业定制企业官网,公司注重人才、技术和管理,汇聚了一批优秀的互联网技术人才,对客户都以感恩的心态奉献自己的专业和所长。

比如说,取数据用get-data.php,下载图片用get-image.php。

2、多进程的话,php可以简单的用pcntl_fork()。这样可以并发多个子进程。

但是我不建议你用fork,我建议你安装一个gearman worker。这样你要并发几个,就启几个worker,写代码简单,根本不用在代码里考虑thread啊,process等等。

3、综上,解决方案这样:

(1)安装gearman worker。

(2)写一个get-data.php,在crontab里设置它每5分钟执行一次,只负责读数据,然后把读回来的数据一条一条的扔到 gearman worker的队列里;

然后再写一个处理数据的脚本作为worker,例如叫process-data.php,这个脚本常驻内存。它作为worker从geraman 队列里读出一条一条的数据,然后跟你的数据库老数据比较,进行你的业务逻辑。如果你要10个并发,那就启动10个process-data.php好了。处理完后,如果图片地址有变动需要下载图片,就把图片地址扔到 gearman worker的另一个队列里。

(3)再写一个download-data.php,作为下载图片的worker,同样,你启动10个20个并发随便你。这个进程也常驻内存运行,从gearman worker的图片数据队列里取数据出来,下载图片

4、常驻进程的话,就是在代码里写个while(true)死循环,让它一直运行好了。如果怕内存泄露啥的,你可以每循环10万次退出一下。然后在crontab里设置,每分钟检查一下进程有没有启动,比如说这样启动3个process-data worker进程:

* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php /dev/null 21'

* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php /dev/null 21'

* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php /dev/null 21'

不知道你明白了没有

php模拟登陆 知乎 显示了登录成功的unicode 但是采集登录后的网页是空白

知乎的程序是加密的,用PHP模拟登录采集数据只能应用于一些没有加密数据的网站。所以你登录采集到的是空白也是正常。

php 百度 知道数据采集

问题其实不难,自己都能写。给你几个思路吧:

1.在百度知道中,输入linux,然后会出现列表。复制浏览器地址栏内容。

然后翻页,在复制地址栏内容,看看有什么不同,不同之处,就是你要循环分页的i值。

当然这个是笨方法。

2.使用php的file或者file_get_contents函数,获取链接URL的内容。

3.通过php正则表达式,获取你需要的3个字段内容。

4.写入数据库。

需要注意的是,百度知道有可能做了防抓取的功能,你刚一抓几个页面,可能会被禁止。

建议也就抓10页数据。

其实不难,你肯定写的出来。 还有,网上应该有很多抓取工具,你找找看,然后将抓下来的数据

在做分析。写入数据库。

php模拟登陆知乎

这种模拟登陆其实很简单,php的话主要用curl来实现。仔细研究一下你要抓的站具体是怎么实现用户登录的,可以用wireshark或者burpsuite(建议用后者)抓包看看整个过程都有那几次请求,每次请求都发送了哪些数据,构造好发给他就可以实现登录了。

之后获取个人信息就很容易了,找找php解析html库,或者最简单粗暴的就是字符串截取函数加正则表达式,把你想要的数据提取出来就好了。

对于你给出的这种验证码属于非常容易识别的验证码了,基本的识别原理参看使用Canvas进行验证码识别。

当然比较蛋疼的问题就是网页编码问题,经常爬过来全是乱码,网上找找看转码的方法,都试一下,这是一门玄学,能不能成功看你人品和耐心吧。

如何利用python 爬取知乎上面的数据

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Author: Administrator

# @Date: 2015-10-31 15:45:27

# @Last Modified by: Administrator

# @Last Modified time: 2015-11-23 16:57:31

import requests

import sys

import json

import re

reload(sys)

sys.setdefaultencoding('utf-8')

#获取到匹配字符的字符串

def find(pattern,test):

finder = re.search(pattern, test)

start = finder.start()

end = finder.end()

return test[start:end-1]

cookies = {

'_ga':'GA1.2.10sdfsdfsdf', '_za':'8d570b05-b0b1-4c96-a441-faddff34',

'q_c1':'23ddd234234',

'_xsrf':'234id':'"ZTE3NWY2ZTsdfsdfsdfWM2YzYxZmE=|1446435757|15fef3b84e044c122ee0fe8959e606827d333134"',

'z_c0':'"QUFBQXhWNGZsdfsdRvWGxaeVRDMDRRVDJmSzJFN1JLVUJUT1VYaEtZYS13PT0=|14464e234767|57db366f67cc107a05f1dc8237af24b865573cbe5"',

'__utmt':'1', '__utma':'51854390.109883802f8.1417518721.1447917637.144c7922009.4',

'__utmb':'518542340.4.10.1447922009', '__utmc':'51123390', '__utmz':'5185435454sdf06.1.1.utmcsr=zhihu.com|utmcgcn=(referral)|utmcmd=referral|utmcct=/',

'__utmv':'51854340.1d200-1|2=registration_date=2028=1^3=entry_date=201330318=1'}

headers = {'user-agent':

'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',

'referer':'',

'host':'','Origin':'',

'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',

'Connection':'keep-alive','X-Requested-With':'XMLHttpRequest','Content-Length':'81',

'Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,zh;q=0.8','Connection':'keep-alive'

}

#多次访问之后,其实一加载时加载20个问题,具体参数传输就是offset,以20递增

dicc = {"offset":60}

n=20

b=0

# 与爬取图片相同的是,往下拉的时候也会发送http请求返回json数据,但是不同的是,像模拟登录首页不同的是除了

# 发送form表单的那些东西后,知乎是拒绝了我的请求了,刚开始以为是headers上的拦截,往headers添加浏览器

# 访问是的headers那些信息添加上,发现还是拒绝访问。

#想了一下,应该是cookie原因。这个加载的请求和模拟登录首页不同

#所以补上其他的cookies信息,再次请求,请求成功。

for x in xrange(20,460,20):

n = n+20

b = b+20

dicc['offset'] = x

formdata = {'method':'next','params':'{"offset":20}','_xsrf':'20770d88051f0f45e941570645f5e2e6'}

#传输需要json串,和python的字典是有区别的,需要转换

formdata['params'] = json.dumps(dicc)

# print json.dumps(dicc)

# print dicc

circle = requests.post("",

cookies=cookies,data=formdata,headers=headers)

#response内容 其实爬过一次之后就大同小异了。 都是

#问题返回的json串格式

# {"r":0,

# "msg": ["div class=\"zm-profile-section-item zg-clear\"\n

# span class=\"zm-profile-vote-count\"\ndiv class=\"zm-profile-vote-num\"205K\/div\n

# div class=\"zm-profile-vote-type\"\u6d4f\u89c8\/div\n

# \/span\ndiv class=\"zm-profile-section-main\"\n

# h2 class=\"zm-profile-question\"\n

# a class=\"question_link\" target=\"_blank\" href=\"\/question\/21719532\"

# \u4ec0\u4e48\u4fc3\u4f7f\u4f60\u8d70\u4e0a\u72ec\u7acb\u5f00\u53d1\u8005\u4e4b\u8def\uff1f\/a\n

# \/h2\ndiv class=\"meta zg-gray\"\na data-follow=\"q:link\" class=\"follow-link zg-unfollow meta-item\"

# href=\"javascript:;\" id=\"sfb-868760\"

# i class=\"z-icon-follow\"\/i\u53d6\u6d88\u5173\u6ce8\/a\nspan class=\"zg-bull\"•\/span\n63 \u4e2a\u56de\u7b54\nspan class=\"zg-bull\"•\/span\n3589 \u4eba\u5173\u6ce8\n\/div\n\/div\n\/div",

# "div class=\"zm-profile-section-item zg-clear\"\n

# span class=\"zm-profile-vote-count\"\n

# div class=\"zm-profile-vote-num\"157K\/div\n

# div class=\"zm-profile-vote-type\"\u6d4f\u89c8\/div\n

# \/span\ndiv class=\"zm-profile-section-main\"\n

# h2 class=\"zm-profile-question\"\n

# a class=\"question_link\" target=\"_blank\" href=\"\/question\/31764065\"

# \u672c\u79d1\u6e23\u6821\u7684\u5b66\u751f\u5982\u4f55\u8fdb\u5165\u7f8e\u5e1d\u725b\u6821\u8bfbPhD\uff1f\/a\n

# \/h2\ndiv class=\"meta zg-gray\"\n

# a data-follow=\"q:link\" class=\"follow-link zg-unfollow meta-item\" href=\"javascript:;\" id=\"sfb-4904877\"

# i class=\"z-icon-follow\"\/i\u53d6\u6d88\u5173\u6ce8\/a\nspan class=\"zg-bull\"•

# \/span\n112 \u4e2a\u56de\u7b54\nspan class=\"zg-bull\"•\/span\n1582 \u4eba\u5173\u6ce8\n

# \/div\n\/div\n\/div"]}

# print circle.content

#同样json串需要自己 转换成字典后使用

jsondict = json.loads(circle.text)

msgstr = jsondict['msg']

# print len(msgstr)

#根据自己所需要的提取信息规则写出正则表达式

pattern = 'question\/.*?/a'

try:

for y in xrange(0,20):

wholequestion = find(pattern, msgstr[y])

pattern2 = '.*?'

finalquestion = find(pattern2, wholequestion).replace('','')

print str(b+y)+" "+finalquestion

#当问题已经访问完后再传参数 抛出异常 此时退出循环

except Exception, e:

print "全部%s个问题" %(b+y)

break


分享题目:如何用PHP采集知乎数据 PHP数据采集
文章位置:http://cdweb.net/article/dodsgie.html