每个网址间隔几秒到十几秒访问, 同链接的爬取结果缓存一段时间。(ip还是会被封,无效)
用无数个代理ip访问,这个是很多爬虫的方法。大多数有效的代理ip要花钱,价格不菲。为了获取免费的代理ip,我又去爬一个免费代理ip的网址来获取代理ip,甚至搞了个 项目 。搞的很复杂然而免费的代理ip很快就会过期,还有延时长的问题,爬取效率也很低。
2方法虽然略慢 但是还是解决了问题一阵子。然而尴尬的事情出现了,我爬的免费代理的网页,也把我墙了。。另外还有个问题,这爬虫一直挂在我的小水管服务器上定时爬,占了我服务器的流量,我还得保证它的运行,很不划算。
最后突然想到,网站一般通过区分浏览器访问和机器访问来反爬,如果我就是用浏览器访问的呢?所以想到了electron,并且这东西可以编译成windows、mac软件直接安装在电脑本地,再也不用在我的小水管上爬了,简直完美。
初始化项目
npm install -g vue-cli
vue init simulatedgreg/electron-vue electron-spider
# Install dependencies and run your app
cd electron-spider
yarn # or npm install
yarn run dev # or npm run dev
由于是例子,直接改生成项目里的 landingPage.vue 页面了,我们爬一下 掘金 ,直接上代码吧
大致思路,用 webview 打开需要爬取的网址,该 webview preload 一个js文件,该文件可以访问新页面并且进行dom读取等操作(类似在浏览器控制台里执行js)。通过electron的相关进程直接通信的api和事件,进行数据传输,主页面拿到数据后可以存储起来或者做别的事。
<template>
<div id="wrapper">
<button
@click="doSearch"
:disabled="isSearching">开始爬取</button>
<p v-if="isSearching">
爬取中, url: {{url}}
<!-- 爬取网址的webview, 该页面 -->
<webview class="search-webview" id="webview" src="" autosize="on" minwidth="1" minheight="1" :preload="fileName"></webview>
<li v-for="post in posts" :key="post.link">
<a :href="post.link" target="_blank">{{ post.title }}</a>
</template>
import path from 'path'
export default {
name: 'landing-page',
data () {
return {
isSearching: false,
url: 'https://juejin.im',
posts: [],
webview: null,
// preload的文件地址
fileName: `file://${path.join(__static, '/doSearch.js')}`
mounted () {
this.webview = document.getElementById('webview')
this.webview.addEventListener('ipc-message', this.receiveMessage)
methods: {
receiveMessage (e) {
const result = JSON.parse(e.args[0])
this.posts = result || []
this.isSearching = false
searchHanlder () {
this.webview.send('ping', 'xxxx')
/** 开始爬取 */
doSearch () {
const { url, isSearching } = this
if (isSearching) return
const webview = this.webview
webview.src = url
this.isSearching = true
this.searchUrl = url
webview.addEventListener('dom-ready', this.searchHanlder)
<style>
.search-webview{
display: block;
visibility: hidden;
height: 0;
</style>
doSearch.js
const ipcRenderer = require('electron').ipcRenderer
function getPostList () {
const postElems = document.querySelectorAll('.entry-list>li.item')
const list = []
postElems.forEach(item => {
const linkElem = item.querySelector('.title-row a') || {}
list.push({
title: linkElem.innerText || '',
link: linkElem.href || ''
return list
function main () {
// 延迟时间等dom渲染
setTimeout(() => {
const list = getPostList()
ipcRenderer.sendToHost('data', JSON.stringify(list))
}, 100)
main()
全部代码进群:864573496
即可!
利用 electron 能做好多事,比如定时操作、本地存储等等。
这个“小项目”当时真是折磨了我好久,也了解了好多反爬的知识,网站反爬策略越来越丰富,除了ip频率控制、浏览器注入cookie判断、甚至有网站会判断鼠标移动之类的用户操作来判断你是不是机器人,当然还有最有效的验证码机制。爬虫和反爬之间的斗智斗勇,感觉就是技术的博弈。爬虫其实对网站还是有影响的,最好要控制频率,不要恶意进行爬取,不然你还是可能会被封ip。
声明:
本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。