Python 抓取船只名称
Python Scraping to extract names of vessels
from scrapy import Selector
import requests
url = 'http://lines.coscoshipping.com/home/Services/ship/0'
html = requests.get(url).content
sel = Selector(text = html)
sel.xpath('//tr/td[1]/div/div/div[2]/div[1]/text()').extract()
'''Can anyone help with this scraping, and I just want to extract the names of each vessels. Many thanks in advance'''
问题:
检查您的 shown URL 的 HTML,页面内容似乎大部分是动态加载的。您可以使用可以 运行 JavaScript 的工具生成页面内容,然后提取相关信息。
requests
library won't do this for you. You can instead use the selenium
图书馆。
使用硒:
首先,观察容器名称的 HTML 如下所示:
<div data-v-5c859f2b="" class="names">
<div data-v-5c859f2b="">中海太平洋</div>
<div data-v-5c859f2b="">CSCL PACIFIC OCEAN</div>
</div>
下面的代码 find_elements_by_class_name()
提取带有 class names
的 HTML 标签(用于船只名称)。
然后,find_elements_by_tag_name()
用于查找子div
标签,其中包含中英文名称。
from selenium import webdriver
import textwrap
url = 'http://lines.coscoshipping.com/home/Services/ship/0'
driver = webdriver.Firefox(executable_path='YOUR PATH') # or Chrome
driver.get(url)
for vessel in driver.find_elements_by_class_name('names'):
chinese, english = vessel.find_elements_by_tag_name('div')
print(textwrap.dedent(f'''
Chinese: {chinese.text}
English: {english.text}
'''))
我还使用 textwrap.dedent()
来美化输出。
示例输出:
Chinese: 中海太平洋
English: CSCL PACIFIC OCEAN
Chinese: 中海印度洋
English: CSCL INDIAN OCEAN
Chinese: 中海大西洋
English: CSCL ATLANTIC OCEAN
Chinese: 中海之星
English: CSCL STAR
...
另请参阅 ,了解如何下载驱动程序(Chrome 或 Firefox)并将其添加到 $PATH
。
另一种方法:
利用splitlines()
,我们可以从div
的每一个中更简洁地提取出船只的中英文名称:
from selenium import webdriver
import textwrap
url = 'http://lines.coscoshipping.com/home/Services/ship/0'
driver = webdriver.Firefox(executable_path='YOUR PATH') # or Chrome
driver.get(url)
for vessel in driver.find_elements_by_class_name('names'):
chinese, english = vessel.text.splitlines()
print(textwrap.dedent(f'''
Chinese: {chinese}
English: {english}
'''))
这有点假设,但通常确实有效(如本例)。
以下脚本应相应地生成结果。
import requests
link = 'http://lines.coscoshipping.com/homeapi/ship/findShips.do?slots=0&language=1'
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
s.headers['Referer'] = 'http://lines.coscoshipping.com/home/Services/ship/0'
r = s.get(link)
for item in r.json()['data']['content']:
print(item['shipNameCn'],item['shipNameEn'])
输出如下:
中海太平洋 CSCL PACIFIC OCEAN
中海印度洋 CSCL INDIAN OCEAN
中海大西洋 CSCL ATLANTIC OCEAN
中海之星 CSCL STAR
中海土星 CSCL SATURN
中海天王星 CSCL URANUS
中海水星 CSCL MERCURY
中海木星 CSCL JUPITER
中海金星 CSCL VENUS
中海火星 CSCL MARS
中海海王星 CSCL NEPTUNE
中海阿里山 JEBEL ALI
from scrapy import Selector
import requests
url = 'http://lines.coscoshipping.com/home/Services/ship/0'
html = requests.get(url).content
sel = Selector(text = html)
sel.xpath('//tr/td[1]/div/div/div[2]/div[1]/text()').extract()
'''Can anyone help with this scraping, and I just want to extract the names of each vessels. Many thanks in advance'''
问题:
检查您的 shown URL 的 HTML,页面内容似乎大部分是动态加载的。您可以使用可以 运行 JavaScript 的工具生成页面内容,然后提取相关信息。
requests
library won't do this for you. You can instead use the selenium
图书馆。
使用硒:
首先,观察容器名称的 HTML 如下所示:
<div data-v-5c859f2b="" class="names">
<div data-v-5c859f2b="">中海太平洋</div>
<div data-v-5c859f2b="">CSCL PACIFIC OCEAN</div>
</div>
下面的代码 find_elements_by_class_name()
提取带有 class names
的 HTML 标签(用于船只名称)。
然后,find_elements_by_tag_name()
用于查找子div
标签,其中包含中英文名称。
from selenium import webdriver
import textwrap
url = 'http://lines.coscoshipping.com/home/Services/ship/0'
driver = webdriver.Firefox(executable_path='YOUR PATH') # or Chrome
driver.get(url)
for vessel in driver.find_elements_by_class_name('names'):
chinese, english = vessel.find_elements_by_tag_name('div')
print(textwrap.dedent(f'''
Chinese: {chinese.text}
English: {english.text}
'''))
我还使用 textwrap.dedent()
来美化输出。
示例输出:
Chinese: 中海太平洋
English: CSCL PACIFIC OCEAN
Chinese: 中海印度洋
English: CSCL INDIAN OCEAN
Chinese: 中海大西洋
English: CSCL ATLANTIC OCEAN
Chinese: 中海之星
English: CSCL STAR
...
另请参阅 $PATH
。
另一种方法:
利用splitlines()
,我们可以从div
的每一个中更简洁地提取出船只的中英文名称:
from selenium import webdriver
import textwrap
url = 'http://lines.coscoshipping.com/home/Services/ship/0'
driver = webdriver.Firefox(executable_path='YOUR PATH') # or Chrome
driver.get(url)
for vessel in driver.find_elements_by_class_name('names'):
chinese, english = vessel.text.splitlines()
print(textwrap.dedent(f'''
Chinese: {chinese}
English: {english}
'''))
这有点假设,但通常确实有效(如本例)。
以下脚本应相应地生成结果。
import requests
link = 'http://lines.coscoshipping.com/homeapi/ship/findShips.do?slots=0&language=1'
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
s.headers['Referer'] = 'http://lines.coscoshipping.com/home/Services/ship/0'
r = s.get(link)
for item in r.json()['data']['content']:
print(item['shipNameCn'],item['shipNameEn'])
输出如下:
中海太平洋 CSCL PACIFIC OCEAN
中海印度洋 CSCL INDIAN OCEAN
中海大西洋 CSCL ATLANTIC OCEAN
中海之星 CSCL STAR
中海土星 CSCL SATURN
中海天王星 CSCL URANUS
中海水星 CSCL MERCURY
中海木星 CSCL JUPITER
中海金星 CSCL VENUS
中海火星 CSCL MARS
中海海王星 CSCL NEPTUNE
中海阿里山 JEBEL ALI