當你興致勃勃地從網路上學習了基本的爬蟲知識後就像找個目標實踐下,擁有大量文章的簡書包含了大量的有價值信息,所以自然成為了你的選擇目標,如果你嘗試之後會發現並沒有想像的那麼簡單,因為裡麵包含了很多js相關的數據傳輸。讓我先使用傳統的爬蟲來示範吧: >
打開簡書首頁,似乎沒有什麼特別的
# jianshu首頁
打開chrome的開發者模式,發現文章的標題,
###############a.png#########接下來就是在尋找頁面上所有的###a###標籤,但是而且慢如果你仔細觀察就會發現滑輪滾到一半的時候頁面就會加載更多,這樣的步驟會重複三次知道底部出現###閱讀更多###的按鈕###href
都在a
標籤裡,似乎也沒有什麼不一樣的
滑輪
不僅如此底部的閱讀更多的
href
並沒有告訴我們加載剩下的頁面信息,唯一的辦法是不斷點擊閱讀更多這個按鈕
load_more.png
#什麼,將滑輪重複三次滑倒頁面的中央並且不斷點擊按鈕這種動作http
請求可做不到,這更像是js操作?沒錯,簡書的文章並不是常規的http請求,我們不能根據不同url不斷重定向,而是頁面的一些動作來載入頁面資訊。
selenium是一個web自動化測試工具,支援很多種語言,我們在這裡可以使用python的selenium做爬蟲使用,爬取簡書的過程中,它的工作原理是不斷注入js程式碼,讓頁面源源不斷的加載,最後再提取所有的a
標籤。首先你得在python中下載selenium套件
>>> pip3 install selenium
selenium必須搭載瀏覽器使用,這裡我使用的是chromedriver,Chrome的開源測試版,它可以使用headless模式不需要顯示前段來存取網頁,算是最大特性了。
在写代码之前一定要把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
其中的text
和href
属性,这里我直接把它们写在了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模式
options = webdriver.ChromeOptions() options.add_argument('headless') browser = webdriver.Chrome("./chromedriver", chrome_options=options) //把上面的browser加入chrome_options参数
当我们没办法使用正常的http请求爬取时,可以使用selenium操纵浏览器来抓取我们想要的内容,这样有利有弊,比如
优点
可以暴力爬虫
简书并不需要cookie才能查看文章,不需要费劲心思找代理,或者说我们可以无限抓取并且不会被ban
首页应该为ajax传输,不需要额外的http请求
缺点
爬取速度太满,想象我们的程序,点击一次需要等待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如何爬取簡書網站的詳細內容。更多資訊請關注PHP中文網其他相關文章!