朝花夕拾|勿忘初心 朝花夕拾|勿忘初心

被反爬虫制裁的惨痛经历

in Python3 read (443) 446汉字 站长Lucifaer 文章转载请注明来源!

今天心血来潮想去爬真白的图,然后就被百度的反爬虫制裁了,希望能有大牛指导一下。

好了,不说惨痛的经历了,接下来总结一下一点简单的Python3爬虫知识。

网上一大堆爬虫教程,但是屁话很多,从BeautifulSoup安装到Request的使用,讲了一堆,还不如看官方文档:

Requests官方文档
BeautifulSoup官方文档

选择BeautifulSoup还是正则表达式

网上都说写爬虫嘛,用BeautifulSoup要便捷很多,我不否认这会省下来很多时间,也不否认这会避免烦人的正则表达式。

但是不能一概而论。

用了BeautifulSoup后,就会觉得没有想象中的那么好用,有些功能真的很麻瓜,甚至有一种不自由的感觉。可以说在通用性上要差正则好多。这里还是建议一下,能用正则还是用正则。

用啥库

这里不说用爬虫框架的问题,只分成简单的动态页面和静态页面。

静态页面:

  • requests
  • BeautifulSoup

动态页面(尤其是动态加载页面):

  • requests
  • re
  • selenium+PhantomJS

被制裁的爬虫代码

from selenium import webdriver
from bs4 import BeautifulSoup
import re
import requests as rq

Regular_String = "http:\/\/img\d\.imgtn\.bdimg\.com\/it\/u=\w+\,\w+\&\w+=23\&\w+=\w\.jpg"
driver = webdriver.PhantomJS(executable_path="./../phantomjs/bin/phantomjs")


def get_url(url):
    driver.get(url)
    source_code = BeautifulSoup(driver.page_source, "html5lib")
    return source_code


def spider(source_code):
    img = re.findall(Regular_String, source_code.text)
    result = sorted(set(img), key=img.index)
    return result


def download_img(img_url):
    i = 0
    for url in img_url:
        print("Downloading:", url)
        try:
            img = rq.get(url)
            if str(img.status_code)[0] == "4":
                print("Download failed", url)
        except Exception as e:
            print("Error", url)
        with open("./img"+str(i)+".jpg", 'wb') as fp:
            fp.write(img.content)
            i += 1
    print("Total Download Files:"+str(len(img_url)))
    print("Success To Download Images")


def show_url(img_url):
    for i in img_url:
        print(i)
    print("Total search Files:" + str(len(img_url)))


def close_driver():
    driver.close()

if __name__ == '__main__':
    url = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E6%A8%B1%E8%8A%B1%E5%BA%84&ct=201326592&v=flip"
    _source_code = get_url(url)
    _img_url = spider(_source_code)
    show_url(_img_url)
    close_driver()

代码没啥好说的,很简单,关于正则的写法,这边稍稍有点建议,可以一边调试一边写,实时验证一下嘛。

被制裁的关键问题在于使用selenium+PhantomJS进行模拟访问后,再利用requests下载图片时,访问为403禁止访问......

猜测是进行了人机检测(废话︿( ̄︶ ̄)︿)。

尝试了构造Headers进行反爬虫,然而并没有卵用。仔细看了一下,应该是使用ajax请求来生成的数据,所以有一个思路就是模拟ajax请求,利用的就是selenium+PhantomJS,好吧又绕回来了,接下来看看selenium+PhantomJS的模拟操作吧。

python3爬虫
最后由Lucifaer修改于2017-06-01 01:10

此处评论已关闭

博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
PREVIOUS NEXT
雷姆
拉姆