Wie Selen+Python die Jianshu-Website crawlt

零到壹度
Freigeben: 2018-04-16 09:52:56
Original
4140 Leute haben es durchsucht

Dieser Artikel stellt vor, wie Selenium+Python die Jianshu-Website crawlt. Jetzt kann ich ihn mit Ihnen teilen.


Seitenladelogik

Wenn Sie mit Begeisterung grundlegende Crawler-Kenntnisse aus dem Internet erlernen, ist es, als würden Sie ein Ziel zum Üben finden. Als nächstes das kurze Buch Wenn Sie es ausprobieren, werden Sie feststellen, dass es nicht so einfach ist, wie Sie denken, da es viele JS-bezogene Datenübertragungen enthält . Lassen Sie mich es zunächst mit einem herkömmlichen Crawler demonstrieren: >

Öffnen Sie die Homepage von Jianshu, da scheint nichts Besonderes zu sein

Jianshu-Homepage

Öffnen Sie den Entwicklermodus von chrome und stellen Sie fest, dass sich der Titel des Artikels und href alle im a-Tag befinden, und es scheint nein zu geben Unterschied

a.png

Der nächste Schritt besteht darin, alle a-Tags auf der Seite zu finden, aber warten Sie, wenn Wenn Sie genau hinschauen, werden Sie feststellen, dass die Rolle zur Hälfte gerollt ist. Dann wird die Seite weiter geladen und dieser Schritt wird dreimal wiederholt, bis unten die Schaltfläche 阅读更多

erscheint.

Pulley

Nicht nur das, sondern auch die weiterführenden Informationen untenhref sagen uns nicht, dass wir die restlichen Seiteninformationen laden sollen , der einzige Weg ist 不断点击阅读更多这个按钮

load_more.png

was, die Riemenscheibe dreimal wiederholen, um sie nach unten zu schieben in der Mitte der SeiteundKontinuierliches Klicken auf die SchaltflächeDiese Art von Vorganghttpkann nicht mit Anfragen durchgeführt werden. Ist das eher eine JS-Operation? Richtig, bei Jianshus Artikel handelt es sich nicht um eine normale HTTP-Anfrage. Wir können nicht ständig nach verschiedenen URLs umleiten, sondern nach einigen Aktionen auf der Seite, um die Seiteninformationen zu laden.

Selenium-Einführung

Selenium ist ein Web-Automatisierungstesttool, das viele Sprachen unterstützt. Wir können Pythons Selenium hier verwenden Als Crawler besteht das Arbeitsprinzip beim Crawlen kurzer Bücher darin, kontinuierlich js-Code einzufügen, die Seite kontinuierlich laden zu lassen und schließlich alle a-Tags zu extrahieren. Zuerst müssen Sie das Selenium-Paket in Python herunterladen.

>>> pip3 install selenium
Nach dem Login kopieren

Chromedriver

Selenium muss mit einem Browser verwendet werden. Hier verwende ich Chromedriver, die Open-Source-Beta In der Chrome-Version kann der Headless-Modus verwendet werden, um auf Webseiten zuzugreifen, ohne den ersten Absatz anzuzeigen, was die größte Funktion darstellt.

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秒比较合理
Nach dem Login kopieren

看看效果

刷出了按钮

接下来就是不断点击按钮加载页面,继续加入刚才的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()函数
'''
Nach dem Login kopieren

这个我就不贴图了,成功之后就是不断地加载页面 ,知道循环完了为止,接下来的工作就简单很多了,就是寻找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
Nach dem Login kopieren

最终结果

简书文章

headless模式

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

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

总结

当我们没办法使用正常的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
Nach dem Login kopieren


相关推荐:

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

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

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

Das obige ist der detaillierte Inhalt vonWie Selen+Python die Jianshu-Website crawlt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage