php可以抓取网页数据吗(百度搜索引擎怎么用ajax加载数据?豆瓣怎么办? )

优采云 发布时间: 2022-02-11 07:05

  php可以抓取网页数据吗(百度搜索引擎怎么用ajax加载数据?豆瓣怎么办?

)

  过去可以通过豆瓣的API接口获取数据,但近几年豆瓣已经关闭了几乎所有的API,我们只能想其他办法了。搜索引擎应该是比较新的数据,我们可以抓取百度搜索引擎来实现这个我们的效果。

  我使用eggjs作为后台,抓取的数据每24小时更新一次。每次访问都会先从缓存中获取数据,如果没有就直接抓取百度的数据。

  获取目标 HTML

  在百度搜索最新电影是这样的:

  

  首先使用curl下载我们要爬取的整个页面

  let html = await this.ctx.curl(baiduUrl);

html = html.data.toString();

  解析 HTML

  我们可以直接匹配上面截图的html代码,但是我发现如果电影名太长会自动转换成省略号而不是全名,这样不好。

  注意下面的页码翻了,应该是用ajax加载数据的。我们可以从这里开始抓取我们想要的数据并使用浏览器调试工具:

  

  响应结果:

  

  正是我们想要的结果,其中还包括电影的封面和评分等信息,相当全面。

  https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=28286&from_mid=1&=&

format=json&ie=utf-8&oe=utf-8&query=最新电影&sort_key=17&

sort_type=1&stat0=&stat1=&stat2=&stat3=&pn=8&rn=8&

cb=jQuery1102026705352123140547_1611809868163&_=1611809868164

  仔细查看上面的网址,发现有一个字符串(8aQDcjqpAAV3otqbppnN2DJv)不知道从哪里弄到,而且这个字符串肯定不一样。打开HTML搜索后,第4000行有一个JS配置:

  

  但是后来我通过服务器抓取网页的时候,这些字段都是空的,可能是因为没有设置user-agent,但是我找到了字段fbtext,这不是我想要的列表吗?为什么需要做其他的分页之类的,直接去正则:

  // 网页匹配

let hotMove = [];

const regReturn = html.match(/fbtext: '(.*),'/gi);

if (regReturn) {

hotMove = regReturn[0].replace("fbtext: '", '').replace(",'", '').split(',');

}

  完整代码

  async getBaiduMovie(type) {

let baiduUrl = 'http://www.baidu.com/s?wd=最新电影';

if (type === 2) {

baiduUrl = 'http://www.baidu.com/s?wd=热门电影';

}

let html = await this.ctx.curl(baiduUrl);

html = html.data.toString();

let hotMove = [];

// 网页匹配

const regReturn = html.match(/fbtext: '(.*),'/gi);

if (regReturn) {

hotMove = regReturn[0].replace("fbtext: '", '').replace(",'", '').split(',');

}

return hotMove;

}

  最终效果

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线