# JS執行方法示例
1. 使用無頭瀏覽器`Pyppeteer` : 使用`page.evaluate()`方法執行JS
2. 使用`PyexecJS`執行JS: 通過`execjs.compile()`編譯JS語句返回`context`,然后通過`context.eval()`方法獲取參數信息
我們以漫畫網為例子:
## 分析過程
1. 打開單個章節地址: https://www.kanman.com/25934/dpcq_1h.html
2. 打開開發者模式(F12) : 之后刷新以下, 點擊`Network`中的頁面,查看`Response`應答頁面原始內容,可以找到當前章節的所有參數內容
3. 通過正則表達式提取出JS內容,執行JS內容獲取參數信息。
## 方法1:通過`PyexecJS`庫執行JS
```python
import requests
import execjs
import re
resp = requests.get('https://www.kanman.com/25934/dpcq_1h.html')
res = re.findall(r'<script>.*?window\.(comicInfo.*?)</script>', resp.text)
js_var = 'var ' + res[0]
print(js_var)
```
var comicInfo={comic_id:25934,comic_newid:"doupocangqiong",comic_name:"斗破蒼穹",last_chapter_id:"1743153",last_chapter_newid:"di864hua-1599272930012",last_chapter_name:"第864話 機關陣",show_type:1,readtype:1,comic_status:1,charge_paid:0,charge_coin_free:1,update_time:1599278405e3,boo_virtual_coin:!0,charge_status:"10000000000000000000",charge_share_free:1,charge_advertise_free:1,charge_truetime_free:1,charge_limittime_free:1,charge_limitline_free:1,charge_vip_free:1,charge_spread_free:1,charge_game_free:1,charge_coupons_free:1,charge_lottery_free:1,charge_limittime_paid:1,charge_limitline_paid:1,charge_others_paid:1,charge_credit_paid:1,is_copyright:1,current_chapter:{chapter_name:"第1話 隕落的天才(上)",chapter_newid:"dpcq_1h",chapter_id:1400558,chapter_domain_suffix:"",chapter_domain:"jumanhua.com",start_num:1,end_num:13,price:0,chapter_image_addr:"",create_date:1502988183537,rule:"/comic/D/斗破蒼穹拆分版/1話/$$.jpg"},prev_chapter:null,next_chapter:{chapter_id:1400559,chapter_newid:"dpcq_2h",chapter_name:"第2話 隕落的天才(中)",price:0,chapter_image_addr:"",create_time:"2020-07-01T09:11:05.000Z",topic_copyright:"",chapter_domain:"jumanhua.com",rule:"/comic/D/斗破蒼穹拆分版/2話/$$.jpg",start_num:1,end_num:12,create_date:1502988183537,chapter_domain_suffix:""},seoTitleTemplate:{default:"{0}{1} {0}漫畫{1}",title:"{0}{1}話 {2} {0}漫畫{1}話 {2} 看漫畫"}}
```python
ctx = execjs.compile(js_var)
current_chapter = ctx.eval('comicInfo.current_chapter')
current_chapter
```
{'chapter_name': '第1話 隕落的天才(上)',
'chapter_newid': 'dpcq_1h',
'chapter_id': 1400558,
'chapter_domain_suffix': '',
'chapter_domain': 'jumanhua.com',
'start_num': 1,
'end_num': 13,
'price': 0,
'chapter_image_addr': '',
'create_date': 1502988183537,
'rule': '/comic/D/斗破蒼穹拆分版/1話/$$.jpg'}
## 方法2: 通過`pyppeteer`方法執行JS
```python
from pyppeteer import launch
import asyncio
ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
proxy_server = "--proxy-server=socks5://127.0.0.1:1084"
browser = await launch(headless=False, args=['--disable-infobars', proxy_server])
pages = await browser.pages()
page1 = pages[0]
await page1.setViewport(viewport={'width': 1280, 'height': 800})
await page1.setUserAgent(ua)
```
```python
await page1.goto('https://www.kanman.com/25934/dpcq_1h.html')
```
<pyppeteer.network_manager.Response at 0x7fbd63769400>
```python
js_get = r'() =>{ return window.comicInfo.current_chapter; }'
text_js1 = await page1.evaluate(js_get)
text_js1
```
{'chapter_name': '第1話 隕落的天才(上)',
'chapter_newid': 'dpcq_1h',
'chapter_id': 1400558,
'chapter_domain_suffix': '',
'chapter_domain': 'jumanhua.com',
'start_num': 1,
'end_num': 13,
'price': 0,
'chapter_image_addr': '',
'create_date': 1502988183537,
'rule': '/comic/D/斗破蒼穹拆分版/1話/$$.jpg'}
```python
ch_name = text_js1['chapter_name']
chapter_id = text_js1['chapter_id']
start_num = text_js1['start_num']
end_num = text_js1['end_num']
rule = text_js1['rule']
prefix = 'https://mhpic.jumanhua.com'
suffix = '-kmh.middle.webp'
for i in range(start_num, end_num+1):
img_url = prefix + rule.replace(r'$$', str(i)) + suffix
print(ch_name, img_url)
```
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/1.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/2.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/3.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/4.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/5.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/6.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/7.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/8.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/9.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/10.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/11.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/12.jpg-kmh.middle.webp
第1話 隕落的天才(上) https://mhpic.jumanhua.com/comic/D/斗破蒼穹拆分版/1話/13.jpg-kmh.middle.webp
```python
browser.close()
```
- 課程大綱
- 入門篇
- 爬蟲是什么
- 為什么要學習爬蟲
- 爬蟲的基本原理
- TCP/IP協議族的基本知識
- HTTP協議基礎知識
- HTML基礎知識
- HTML_DOM基礎知識
- urllib3庫的基本使用
- requests庫的基本使用
- Web頁面數據解析處理方法
- re庫正則表達式的基礎使用
- CSS選擇器參考手冊
- XPath快速了解
- 實戰練習:百度貼吧熱議榜
- 進階篇
- 服務端渲染(CSR)頁面抓取方法
- 客戶端渲染(CSR)頁面抓取方法
- Selenium庫的基本使用
- Selenium庫的高級使用
- Selenium調用JavaScript方法
- Selenium庫的遠程WebDriver
- APP移動端數據抓取基礎知識
- HTTP協議代理抓包分析方法
- Appium測試Android應用基礎環境準備
- Appium爬蟲編寫實戰學習
- Appium的元素相關的方法
- Appium的Device相關操作方法
- Appium的交互操作方法
- 代理池的使用與搭建
- Cookies池的搭建與用法
- 數據持久化-數據庫的基礎操作方法(mysql/redis/mongodb)
- 執行JS之execjs庫使用
- 高級篇
- Scrapy的基本知識
- Scrapy的Spider詳細介紹
- Scrapy的Selector選擇器使用方法
- Scrapy的Item使用方法
- Scrapy的ItemPipeline使用方法
- Scrapy的Shell調試方法
- Scrapy的Proxy設置方法
- Scrapy的Referer填充策略
- Scrapy的服務端部署方法
- Scrapy的分布式爬蟲部署方法
- Headless瀏覽器-pyppeteer基礎知識
- Headless瀏覽器-pyppeteer常用的設置方法
- Headless瀏覽器-反爬應對辦法
- 爬蟲設置技巧-UserAgent設置
- 反爬策略之驗證碼處理方法
- 反爬識別碼之點擊文字圖片的自動識別方法
- 反爬字體處理方法總結
- 防止反爬蟲的設置技巧總結
- 實戰篇
- AJAX接口-CSDN技術博客文章標題爬取
- AJAX接口-拉購網職位搜索爬蟲
- 執行JS示例方法一之動漫圖片地址獲取方法
- JS執行方法示例二完整mangabz漫畫爬蟲示例
- 應用實踐-SOCKS代理池爬蟲
- 落霞小說爬蟲自動制作epub電子書
- 一種簡單的適用于分布式模式知乎用戶信息爬蟲實現示例
- 法律安全說明