ホームページ  >  記事  >  バックエンド開発  >  Selenium+Python が Jianshu ウェブサイトをクロールする方法

Selenium+Python が Jianshu ウェブサイトをクロールする方法

零到壹度
零到壹度オリジナル
2018-04-16 09:52:564139ブラウズ

この記事では、Selenium+Python が Jianshu の Web サイトをクロールする方法を紹介します。これには、必要な友達が参照できるようになりました


とき。クローラーの基礎知識をインターネットで熱心に学ぶと、記事数の多い短い本に多くの貴重な情報が含まれているため、練習の対象となるものを見つけるのと同じです。これには JS 関連のデータ送信が大量に含まれているため、思ったほど単純ではないことがわかります。 まずは従来のクローラーを使ってデモしてみましょう: >

Jianshu ホームページを開きます。特別なことは何もないようです

jianshu ホームページ

Chrome の開発者モードでは、記事のタイトルと href がすべて a タグ、何も変わらないようです

a.png

chrome的开发者模式,发现文章的标题,href都在a标签里,似乎也没有什么不一样的

a.png

接下来就是寻找页面上所有的a标签,但是且慢如果你仔细观察就会发现滑轮滚到一半的时候页面就会加载更多,这样的步骤会重复三次知道底部出现阅读更多

次のステップは、すべての a タグを見つけることです。ページが表示されますが、ちょっと待ってください。注意深く観察すると、プーリーが半分回転するとページがさらに読み込まれることがわかります。このステップは、底部が表示されるまで 3 回繰り返されます。続きを読むボタン 🎜

Pulley

それだけでなく、下部にある 続きを読む href は、ページの残りの部分をロードするように指示しません。唯一の方法は、続きを読むボタンをクリックし続けることですhref并没有告诉我们加载剩下的页面信息,唯一的办法是不断点击阅读更多这个按钮

load_more.png

什么,将滑轮重复三次滑倒页面的中央并且不断点击按钮这种操作http请求可做不到,这更像是js操作?没错,简书的文章并不是常规的http请求,我们不能根据不同url不断重定向,而是页面的一些动作来加载页面信息。

selenium介绍

selenium是一个web自动化测试工具,支持很多种语言,我们在这里可以使用python的selenium做爬虫使用,爬取简书的过程中,它的工作原理是不断注入js代码,让页面源源不断的加载,最后再提取所有的a

load_more.png

なんと、滑車を繰り返してください3 回下にスライドしてページの中央をボタンをクリックし続けますこの操作httpリクエストは実行できませんか?これは js 操作に似ていますか?そうです、Jianshu の記事は通常の http リクエストではなく、さまざまな URL に従って常にリダイレクトすることはできませんが、ページ情報をロードするためにページ上でいくつかのアクションが実行されます。

🎜🎜

🎜selenium の概要🎜

🎜selenium は、多くの機能をサポートする Web 自動テスト ツールです。単純な書籍をクロールするプロセスでは、Python の Selenium をクローラーとして使用できます。その動作原理は、JS コードを継続的に挿入し、ページを継続的に読み込み、最後にすべての タグ。まず、Python で Selenium パッケージをダウンロードする必要があります🎜
>>> pip3 install selenium
🎜🎜chromedriver🎜🎜🎜selenium はブラウザで使用する必要があります。ここでは、Chrome のオープンソース ベータ版である chromedriver を使用します。ヘッドレス モードを使用して、表示せずに Web ページにアクセスできます。前段これが最大の特徴です。 🎜

python中操作

在写代码之前一定要把chromedriver同一文件夹内,因为我们需要引用PATH,这样方便点。首先我们的第一个任务是刷出加载更多的按钮,需要做3次将滑轮重复三次滑倒页面的中央,这里方便起见我滑到了底部

from selenium import webdriverimport time
browser = webdriver.Chrome("./chromedriver")
browser.get("https://www.jianshu.com/")for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") // execute_script是插入js代码的
    time.sleep(2) //加载需要时间,2秒比较合理

看看效果

刷出了按钮

接下来就是不断点击按钮加载页面,继续加入刚才的py文件之中

for j in range(10):  //这里我模拟10次点击    
    try: 
        button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")
        time.sleep(2)    except:        pass'''
 上面的js代码说明一下
 var a = document.getElementsByClassName('load-more');选择load-more这个元素
 a[0].click(); 因为a是一个集合,索引0然后执行click()函数
'''

这个我就不贴图了,成功之后就是不断地加载页面 ,知道循环完了为止,接下来的工作就简单很多了,就是寻找a标签,get其中的texthref属性,这里我直接把它们写在了txt文件之中.

titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f:    for t in titles:        try:
            f.write(t.text + " " + t.get_attribute("href"))
            f.write("\n")        except TypeError:            pass

最终结果

简书文章

headless模式

不断加载页面肯定也很烦人,所以我们测试成功之后并不想把浏览器显示出来,这需要加上headless模式

options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome("./chromedriver", chrome_options=options) //把上面的browser加入chrome_options参数

总结

当我们没办法使用正常的http请求爬取时,可以使用selenium操纵浏览器来抓取我们想要的内容,这样有利有弊,比如

  • 优点

  1. 可以暴力爬虫

  2. 简书并不需要cookie才能查看文章,不需要费劲心思找代理,或者说我们可以无限抓取并且不会被ban

  3. 首页应该为ajax传输,不需要额外的http请求

缺点

  1. 爬取速度太满,想象我们的程序,点击一次需要等待2秒那么点击600次需要1200秒, 20分钟...

附加

这是所有完整的代码

from selenium import webdriverimport time

options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome("./chromedriver", chrome_options=options)

browser.get("https://www.jianshu.com/")for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)# print(browser)for j in range(10):    try:
        button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")
        time.sleep(2)    except:        pass#titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f:    for t in titles:        try:
            f.write(t.text + " " + t.get_attribute("href"))
            f.write("\n")        except TypeError:            pass


相关推荐:

[python爬虫] Selenium爬取新浪微博内容及用户信息

[Python爬虫]利用Selenium等待Ajax加载及模拟自动翻页,爬取东方财富网公司公告

Python爬虫:Selenium+ BeautifulSoup 爬取JS渲染的动态内容(雪球网新闻)

以上がSelenium+Python が Jianshu ウェブサイトをクロールする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。