Hướng dẫn python crawl data from website - dữ liệu thu thập dữ liệu python từ trang web

Cập nhật lần cuối vào ngày 21 tháng 6 năm 2022

Ngày xưa, đó là một công việc tẻ nhạt để thu thập dữ liệu và đôi khi nó rất tốn kém. Các dự án học máy không thể sống mà không có dữ liệu. May mắn thay, chúng tôi có rất nhiều dữ liệu trên web theo ý của chúng tôi ngày nay. Chúng tôi có thể sao chép dữ liệu từ web để tạo bộ dữ liệu của chúng tôi. Chúng tôi có thể tải xuống các tệp theo cách thủ công và lưu chúng vào đĩa. Nhưng chúng ta có thể làm điều đó hiệu quả hơn bằng cách tự động hóa việc thu hoạch dữ liệu. Có một số công cụ trong Python có thể giúp tự động hóa.

Sau khi hoàn thành hướng dẫn này, bạn sẽ học:

  • Cách sử dụng thư viện yêu cầu để đọc dữ liệu trực tuyến bằng HTTP
  • Cách đọc bảng trên các trang web bằng gấu trúc
  • Cách sử dụng selen để mô phỏng các hoạt động của trình duyệt

Bắt đầu dự án của bạn với cuốn sách mới Python for Machine Learning, bao gồm các hướng dẫn từng bước và các tệp mã nguồn Python cho tất cả các ví dụ. with my new book Python for Machine Learning, including step-by-step tutorials and the Python source code files for all examples.

Bắt đầu nào!

Hướng dẫn python crawl data from website - dữ liệu thu thập dữ liệu python từ trang web

Web Crawling trong Pythonphoto của Ray Bilcliff. Một số quyền được bảo lưu.
Photo by Ray Bilcliff. Some rights reserved.

Tổng quan

Hướng dẫn này được chia thành ba phần; họ đang:

  • Sử dụng thư viện yêu cầu
  • Đọc bảng trên web bằng gấu trúc
  • Đọc nội dung động với selen

Sử dụng thư viện yêu cầu

Khi chúng ta nói về việc viết một chương trình Python để đọc từ web, không thể tránh khỏi việc chúng ta có thể tránh được thư viện ____ 0 & nbsp; Bạn cần cài đặt nó (cũng như BeautifulSoup và LXML mà chúng tôi sẽ đề cập sau):

Cài đặt PIP Yêu cầu BeautifulSoup4 LXML

Nó cung cấp cho bạn một giao diện cho phép bạn tương tác với web một cách dễ dàng.

Trường hợp sử dụng rất đơn giản sẽ là đọc một trang web từ URL:

Nhập yêu cầurequests

# Lat-lon của New York

URL="https://weather.com/weather/today/l/40.75,-73.98"="https://weather.com/weather/today/l/40.75,-73.98"

resp=requests.get(URL)=requests.get(URL)

print(resp.status_code)(resp.status_code)

print(resp.text)(resp.text)

200

name = "ViewPort" Content = "Width = Device-Width, Ban đầu-scale = 1, chế độ xem-fit = cover"/>

...

Nếu bạn quen thuộc với HTTP, có lẽ bạn có thể nhớ lại rằng mã trạng thái 200 có nghĩa là yêu cầu được thực hiện thành công. Sau đó, chúng ta có thể đọc phản hồi. Ở trên, chúng tôi đọc phản hồi văn bản và nhận HTML của trang web. Nếu nó là CSV hoặc một số dữ liệu văn bản khác, chúng ta có thể đưa chúng vào thuộc tính text của đối tượng phản hồi. Ví dụ, đây là cách chúng ta có thể đọc CSV từ dữ liệu kinh tế của Dự trữ Liên bang:

Nhập IOio

Nhập Pandas ASPDpandas aspd

Nhập yêu cầurequests

URL="https://fred.stlouisfed.org/graph/fredgraph.csv?id=T10YIE&cosd=2017-04-14&coed=2022-04-14"="https://fred.stlouisfed.org/graph/fredgraph.csv?id=T10YIE&cosd=2017-04-14&coed=2022-04-14"

resp=requests.get(URL)= requests.get(URL)

ifresp.status_code==200:resp.status_code==200:

# Lat-lon của New Yorkcsvtext=resp.text

   csvbuffer= io.StringIO(csvtext)

name = "ViewPort" Content = "Width = Device-Width, Ban đầu-scale = 1, chế độ xem-fit = cover"/>df=pd.read_csv(csvbuffer)

...print(df)

Nếu bạn quen thuộc với HTTP, có lẽ bạn có thể nhớ lại rằng mã trạng thái 200 có nghĩa là yêu cầu được thực hiện thành công. Sau đó, chúng ta có thể đọc phản hồi. Ở trên, chúng tôi đọc phản hồi văn bản và nhận HTML của trang web. Nếu nó là CSV hoặc một số dữ liệu văn bản khác, chúng ta có thể đưa chúng vào thuộc tính text của đối tượng phản hồi. Ví dụ, đây là cách chúng ta có thể đọc CSV từ dữ liệu kinh tế của Dự trữ Liên bang:

Nhập IO

Nhập Pandas ASPD

& nbsp; & nbsp; csvtext = resp.text

& nbsp; & nbsp; csvbuffer = io.Stringio (csvtext)

& nbsp; & nbsp; df = pd.read_csv (csvbuffer)

...          ...    ...

& nbsp; & nbsp; In (DF)

Ngày t10yie

0 & nbsp; & nbsp; & nbsp; & nbsp; 2017-04-17 & nbsp; & nbsp; 1,88

1302  2022-04-13    2.8

1 & nbsp; & nbsp; & nbsp; & nbsp; 2017-04-18 & nbsp; & nbsp; 1,85

2 & nbsp; & nbsp; & nbsp; & nbsp; 2017-04-19 & nbsp; & nbsp; 1,85

3 & nbsp; & nbsp; & nbsp; & nbsp; 2017-04-20 & nbsp; & nbsp; 1,85

Nhập yêu cầurequests

URL="https://api.github.com/users/jbrownlee"="https://api.github.com/users/jbrownlee"

resp=requests.get(URL)=requests.get(URL)

ifresp.status_code==200:resp.status_code==200:

    data=resp.json()data=resp.json()

    print(data)print(data)

# Lat-lon của New York

'avatar_url': 'https://avatars.githubusercontent.com/u/12891?v=4',

name = "ViewPort" Content = "Width = Device-Width, Ban đầu-scale = 1, chế độ xem-fit = cover"/>

...

...

Nếu bạn quen thuộc với HTTP, có lẽ bạn có thể nhớ lại rằng mã trạng thái 200 có nghĩa là yêu cầu được thực hiện thành công. Sau đó, chúng ta có thể đọc phản hồi. Ở trên, chúng tôi đọc phản hồi văn bản và nhận HTML của trang web. Nếu nó là CSV hoặc một số dữ liệu văn bản khác, chúng ta có thể đưa chúng vào thuộc tính text của đối tượng phản hồi. Ví dụ, đây là cách chúng ta có thể đọc CSV từ dữ liệu kinh tế của Dự trữ Liên bang:

Nhập IO

Nhập Pandas ASPD

& nbsp; & nbsp; csvtext = resp.text

& nbsp; & nbsp; csvbuffer = io.Stringio (csvtext)

& nbsp; & nbsp; df = pd.read_csv (csvbuffer)

& nbsp; & nbsp; In (DF)

Nhập yêu cầurequests

URL="https://en.wikipedia.org/static/images/project-logos/enwiki.png"="https://en.wikipedia.org/static/images/project-logos/enwiki.png"

wikilogo=requests.get(URL)=requests.get(URL)

ifwikilogo.status_code==200:wikilogo.status_code== 200:

& nbsp; & nbsp; & nbsp; & nbsp; với Openwith open("enwiki.png","wb")asfp:

        fp.write(wikilogo.content)fp.write(wikilogo.content)

Cho rằng chúng tôi đã có được trang web, chúng tôi nên trích xuất dữ liệu như thế nào? Điều này vượt xa những gì thư viện requests có thể cung cấp cho chúng tôi, nhưng chúng tôi có thể sử dụng một thư viện khác để giúp đỡ. Có hai cách chúng ta có thể làm điều đó, tùy thuộc vào cách chúng ta muốn chỉ định dữ liệu.

Cách đầu tiên là coi HTML là một loại tài liệu XML và sử dụng ngôn ngữ XPath để trích xuất phần tử. Trong trường hợp này, chúng tôi có thể sử dụng thư viện ____ 5 & NBSP; trước tiên tạo mô hình đối tượng tài liệu (DOM) và sau đó tìm kiếm bởi XPath:

.....

từ nhập khẩu LXML ETREElxml import etree

# Tạo DOM từ văn bản HTML

dom=etree.HTML(resp.text)=etree.HTML(resp.text)

# Tìm kiếm phần tử nhiệt độ và nhận nội dung

Elements = dom.xpath ("// span [@data-testid = 'nhiệt độValue' và chứa (@class, 'currentConditions')]") =dom.xpath("//span[@data-testid='TemperatureValue' and contains(@class,'CurrentConditions')]")

print(elements[0].text)(elements[0].text)

XPath là một chuỗi chỉ định cách tìm một phần tử. Đối tượng LXML cung cấp hàm xpath() để tìm kiếm DOM cho các phần tử khớp với chuỗi XPath, có thể là nhiều trận đấu. XPath ở trên có nghĩa là tìm một phần tử HTML ở bất cứ đâu với thẻ ____ 7 & nbsp; và với thuộc tính & nbsp; ____ ____ 8 phù hợp với ____ ____99 và & nbsp; Chúng ta có thể tìm hiểu điều này từ các công cụ phát triển của trình duyệt (ví dụ: ảnh chụp màn hình Chrome bên dưới) bằng cách kiểm tra nguồn HTML.

Hướng dẫn python crawl data from website - dữ liệu thu thập dữ liệu python từ trang web

Ví dụ này là tìm nhiệt độ của thành phố New York, được cung cấp bởi yếu tố cụ thể này mà chúng tôi nhận được từ trang web này. Chúng tôi biết phần tử đầu tiên phù hợp với XPath là những gì chúng tôi cần và chúng tôi có thể đọc văn bản bên trong thẻ ____ 7 & nbsp;

Một cách khác là sử dụng các bộ chọn CSS trên tài liệu HTML, mà chúng ta có thể sử dụng thư viện đẹp:

.....

từ nhập khẩu LXML ETREEbs4 import BeautifulSoup

soup=BeautifulSoup(resp.text,"lxml")=BeautifulSoup(resp.text,"lxml")

elements=soup.select('span[data-testid="TemperatureValue"][class^="CurrentConditions"]')= soup.select('span[data-testid="TemperatureValue"][class^="CurrentConditions"]')

print(elements[0].text)(elements[0].text)

# Tạo DOM từ văn bản HTML

# Tìm kiếm phần tử nhiệt độ và nhận nội dung

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Elements = dom.xpath ("// span [@data-testid = 'nhiệt độValue' và chứa (@class, 'currentConditions')]")requests

từ nhập khẩu LXML ETREElxml import etree

# Tạo DOM từ văn bản HTML

URL="https://weather.com/weather/today/l/40.75,-73.98"="https://weather.com/weather/today/l/40.75,-73.98"

resp=requests.get(URL)=requests.get(URL)

ifresp.status_code==200: resp.status_code==200:

# Tìm kiếm phần tử nhiệt độ và nhận nội dung# Using lxml

    dom=etree.HTML(resp.text)dom=etree.HTML(resp.text)

Elements = dom.xpath ("// span [@data-testid = 'nhiệt độValue' và chứa (@class, 'currentConditions')]")elements =dom.xpath("//span[@data-testid='TemperatureValue' and contains(@class,'CurrentConditions')]")

    print(elements[0].text)print(elements[0].text)

XPath là một chuỗi chỉ định cách tìm một phần tử. Đối tượng LXML cung cấp hàm xpath() để tìm kiếm DOM cho các phần tử khớp với chuỗi XPath, có thể là nhiều trận đấu. XPath ở trên có nghĩa là tìm một phần tử HTML ở bất cứ đâu với thẻ ____ 7 & nbsp; và với thuộc tính & nbsp; ____ ____ 8 phù hợp với ____ ____99 và & nbsp; Chúng ta có thể tìm hiểu điều này từ các công cụ phát triển của trình duyệt (ví dụ: ảnh chụp màn hình Chrome bên dưới) bằng cách kiểm tra nguồn HTML.# Using BeautifulSoup

    soup=BeautifulSoup(resp.text,"lxml")soup =BeautifulSoup(resp.text,"lxml")

    elements=soup.select('span[data-testid="TemperatureValue"][class^="CurrentConditions"]')elements=soup.select('span[data-testid="TemperatureValue"][class^="CurrentConditions"]')

    print(elements[0].text)print(elements[0].text)

Ví dụ này là tìm nhiệt độ của thành phố New York, được cung cấp bởi yếu tố cụ thể này mà chúng tôi nhận được từ trang web này. Chúng tôi biết phần tử đầu tiên phù hợp với XPath là những gì chúng tôi cần và chúng tôi có thể đọc văn bản bên trong thẻ ____ 7 & nbsp;

Một cách khác là sử dụng các bộ chọn CSS trên tài liệu HTML, mà chúng ta có thể sử dụng thư viện đẹp:

Từ BS4 Nhập cảnh đẹp

Ở trên, trước tiên chúng tôi chuyển văn bản HTML của chúng tôi cho BeautifulSoup. Đẹp hỗ trợ các trình phân tích cú pháp HTML khác nhau, mỗi người có khả năng khác nhau. Ở trên, chúng tôi sử dụng thư viện lxml làm trình phân tích cú pháp theo khuyến nghị của BeautifulSoup (và nó cũng thường là nhanh nhất). Bộ chọn CSS là một ngôn ngữ nhỏ khác nhau, với ưu và nhược điểm so với XPath. Bộ chọn ở trên giống hệt với XPath chúng tôi đã sử dụng trong ví dụ trước. Do đó, chúng ta có thể nhận được cùng nhiệt độ từ phần tử phù hợp đầu tiên.pandas aspd

tables=pd.read_html("https://www.federalreserve.gov/releases/h25/")=pd.read_html("https://www.federalreserve.gov/releases/h25/")

print(tables)(tables)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

Sau đây là mã hoàn chỉnh để in nhiệt độ hiện tại của New York theo thông tin thời gian thực trên web:

Nhập yêu cầu

# Đọc nhiệt độ của New York

2 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Phi tài chính & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; nan & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan

3 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,30 & nbsp; & nbsp; & nbsp; & nbsp; 0,34 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0.36 & nbsp;

4 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; N.A. & nbsp; & nbsp; & nbsp; & nbsp; 0,48 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

5 & ​​nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; N.A. & nbsp; & nbsp; & nbsp; & nbsp; N.A. & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

6 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan

7 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,49 & nbsp; & nbsp; & nbsp; & nbsp; 0,45 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0.46 & nbsp;

8 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; N.A. & nbsp; & nbsp; & nbsp; & nbsp; N.A. & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

9 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,85 & nbsp; & nbsp; & nbsp; & nbsp; 0,81 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,75 & nbsp;

10 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Khoản vay Ngân hàng Prime 2 3 7 & nbsp; & nbsp; & nbsp; & nbsp; 3.50 & nbsp; & nbsp; & nbsp; & nbsp; 3.50 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 3.50 & nbsp;

11 & nbsp; & nbsp; & nbsp; & nbsp; 0,50 & nbsp; & nbsp; & nbsp; & nbsp; 0,50 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,50 & nbsp;

12 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Chứng khoán chính phủ & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; nan & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan

13 & nbsp; & nbsp; Hóa đơn Kho bạc (Thị trường thứ cấp) 3 4 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; nan & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan

14 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,21 & nbsp; & nbsp; & nbsp; & nbsp; 0,20 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0.21 & nbsp;

15 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 3 tháng & nbsp; & nbsp; & nbsp; & nbsp; 0,68 & nbsp; & nbsp; & nbsp; & nbsp; 0,69 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,78 & nbsp; & nbsp;

16 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 6 tháng & nbsp; & nbsp; & nbsp; & nbsp; 1.12 & nbsp; & nbsp; & nbsp; & nbsp; 1.16 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1.22 & nbsp; & nbsp;

17 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1.69 & nbsp; & nbsp; & nbsp; & nbsp; 1.72 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1.75 & nbsp; & nbsp;

18 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan

19 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Danh nghĩa 9 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; nan & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan

20 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 tháng & nbsp; & nbsp; & nbsp; & nbsp; 0,21 & nbsp; & nbsp; & nbsp; & nbsp; 0,20 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,22 & nbsp; & nbsp;

21 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 3 tháng & nbsp; & nbsp; & nbsp; & nbsp; 0,68 & nbsp; & nbsp; & nbsp; & nbsp; 0,70 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,77 & nbsp;

22 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 6 tháng & nbsp; & nbsp; & nbsp; & nbsp; 1.15 & nbsp; & nbsp; & nbsp; & nbsp; 1.19 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1.23 & nbsp; & nbsp;

23 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1.78 & nbsp; & nbsp; & nbsp; & nbsp; 1.81 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1.85 & nbsp; & nbsp;

24 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.47 & nbsp; & nbsp; & nbsp; & nbsp; 2.53 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.50 & nbsp; & nbsp;

25 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.66 & nbsp; & nbsp; & nbsp; & nbsp; 2.73 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.73 & nbsp; & nbsp;

26 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.70 & nbsp; & nbsp; & nbsp; & nbsp; 2.76 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.79 & nbsp; & nbsp;

27 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.73 & nbsp; & nbsp; & nbsp; & nbsp; 2.79 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.84 & nbsp; & nbsp;

28 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 10 năm & nbsp; & nbsp; & nbsp; & nbsp; 2.66 & nbsp; & nbsp; & nbsp; & nbsp; 2.72 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.79 & nbsp; & nbsp;

NBSP; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 20 năm & nbsp; & nbsp; & nbsp; & nbsp; 2.87 & nbsp; & nbsp; & nbsp; & nbsp; 2.94 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 3.02 & nbsp; & nbsp;

30 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 30 năm & nbsp; & nbsp; & nbsp; & nbsp; 2.69 & nbsp; & nbsp; & nbsp; & nbsp; 2.76 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2.84 & nbsp; & nbsp;

31 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; nan & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Nan

32 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; -0,58 & nbsp; & nbsp; & nbsp; & nbsp; -0,65 & nbsp; & nbsp; & nbsp; & nbsp; -0,59

33 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; -0.32 & nbsp; & nbsp; & nbsp; & nbsp; -0.36 & nbsp; & nbsp; & nbsp; & nbsp; -0.31

34 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 10 năm & nbsp; & nbsp; & nbsp; & nbsp; -0.16 & nbsp; -0.12 & nbsp; & nbsp; & nbsp; & nbsp; -0,14 & nbsp; & nbsp; & nbsp; & nbsp; -0.10

NBSP; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 20 năm & nbsp; & nbsp; & nbsp; & nbsp; 0,09 & nbsp; & nbsp; & nbsp; & nbsp; 0.11 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0.15 & nbsp;

36 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 30 năm & nbsp; & nbsp; & nbsp; & nbsp; 0,21 & nbsp; & nbsp; & nbsp; & nbsp; 0,23 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0.27 & nbsp;

37 & nbsp; & nbsp; lạm phát trung bình dài hạn 11 & nbsp; & nbsp; & nbsp; & nbsp; 0,23 & nbsp; & nbsp; & nbsp; & nbsp; 0,26 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0,30 & nbsp; & nbsp; ; & nbsp; 0 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1

0 & nbsp; & nbsp; n.a. & nbsp; & nbsp; không có sẵn.]

Hàm & nbsp; ____ 14 trong gấu trúc đọc một URL và tìm thấy tất cả các bảng trên trang. Mỗi bảng được chuyển đổi thành một gấu trúc DataFrame và sau đó trả lại tất cả chúng trong một danh sách. Trong ví dụ này, chúng tôi đang đọc các mức lãi suất khác nhau từ Cục Dự trữ Liên bang, chỉ có một bảng trên trang này. Các cột bảng được xác định tự động bởi gấu trúc.

Rất có thể là không phải tất cả các bảng là những gì chúng ta quan tâm. Đôi khi, trang web sẽ sử dụng một bảng chỉ như một cách để định dạng trang, nhưng gấu trúc có thể không đủ thông minh để nói. Do đó, chúng ta cần kiểm tra và chọn anh đào kết quả được trả về bởi chức năng ____ 14 & nbsp;

Bạn muốn bắt đầu với Python để học máy?

Tham gia khóa học gặp sự cố email 7 ngày miễn phí của tôi ngay bây giờ (với mã mẫu).

Nhấp để đăng ký và cũng nhận được phiên bản Ebook PDF miễn phí của khóa học.

Đọc nội dung động với selen

Một phần đáng kể của các trang web hiện đại là đầy đủ các javascripts. Điều này cho chúng ta một trải nghiệm huyền ảo nhưng trở thành một trở ngại để sử dụng như một chương trình để trích xuất dữ liệu. Một ví dụ là trang chủ của Yahoo, nếu chúng ta chỉ tải trang và tìm tất cả các tiêu đề tin tức, thì có ít hơn nhiều so với những gì chúng ta có thể thấy trên trình duyệt:

Nhập yêu cầurequests

# Đọc trang chủ Yahoo

URL="https://www.yahoo.com/"="https://www.yahoo.com/"

resp=requests.get(URL)=requests.get(URL)

dom=etree.HTML(resp.text)= etree.HTML(resp.text)

# Tiêu đề tin tức

elements=dom.xpath("//h3/a[u[@class='StretchedBox']]")=dom.xpath("//h3/a[u[@class='StretchedBox']]")

Sự bất đồng của Forelem:elem inelements:

    print(etree.tostring(elem,method="text",encoding="unicode"))print(etree.tostring(elem, method="text",encoding="unicode"))

Điều này là do các trang web như thế này dựa vào JavaScript để điền vào nội dung. Các khung web nổi tiếng như AngularJS hoặc React đang đằng sau việc cung cấp năng lượng cho thể loại này. Thư viện Python, chẳng hạn như requests, không hiểu JavaScript. Do đó, bạn sẽ thấy kết quả khác nhau. Nếu dữ liệu bạn muốn tìm nạp từ web là một trong số đó, bạn có thể nghiên cứu cách JavaScript được gọi và bắt chước hành vi của trình duyệt trong chương trình của bạn. Nhưng điều này có lẽ là quá tẻ nhạt để làm cho nó hoạt động.

Một cách khác là yêu cầu một trình duyệt thực để đọc trang web thay vì sử dụng & nbsp; ________ 0. Đây là những gì Selenium có thể làm. Trước khi chúng tôi có thể sử dụng nó, chúng tôi cần cài đặt thư viện:

Nhưng selen chỉ là một khung để kiểm soát các trình duyệt. Bạn cần cài đặt trình duyệt trên máy tính cũng như trình điều khiển để kết nối selen với trình duyệt. Nếu bạn có ý định sử dụng Chrome, bạn cũng cần tải xuống và cài đặt Chromedriver. Bạn cần đặt trình điều khiển vào đường dẫn thực thi để selen có thể gọi nó giống như một lệnh bình thường. Ví dụ: trong Linux, bạn chỉ cần lấy text8 thực thi từ tệp zip được tải xuống và đặt nó vào text9.

Tương tự, nếu bạn sử dụng Firefox, bạn cần & NBSP; Geckodriver. Để biết thêm chi tiết về việc thiết lập selen, bạn nên tham khảo tài liệu của nó.

Sau đó, bạn có thể sử dụng tập lệnh Python để kiểm soát hành vi trình duyệt. Ví dụ:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

Thời gian nhập khẩutime

từ Selenium Nhập WebDriverselenium import webdriver

từ selenium.webdriver.support.ui Nhập WebDriverWaitselenium.webdriver.support.ui import WebDriverWait

từ selenium.webdriver.common.by nhập bằng cáchselenium.webdriver.common.by import By

# Khởi chạy trình duyệt Chrome ở chế độ không đầu

options=webdriver.ChromeOptions()=webdriver.ChromeOptions()

options.add_argument("headless").add_argument("headless")

browser=webdriver.Chrome(options=options)= webdriver.Chrome(options=options)

# Tải trang web

browser.get("https://www.yahoo.com").get("https://www.yahoo.com")

# Vận chuyển mạng cần có thời gian. Đợi cho đến khi trang được tải đầy đủ

DEF IS_READY (Trình duyệt):is_ready(browser):

    returnbrowser.execute_script(r"""returnbrowser.execute_script(r"""

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

    """)"")

WebDriverWait(browser,30).until(is_ready)(browser, 30).until(is_ready)

# Cuộn xuống cuối trang để kích hoạt hành động JavaScript

Browser.execute_script ("window.scrollto (0, document.body.scrollHeight);").execute_script("window.scrollTo(0, document.body.scrollHeight);")

time.sleep(1).sleep(1)

WebDriverWait(browser,30).until(is_ready)(browser, 30).until(is_ready)

# Tìm kiếm các tiêu đề tin tức và in

elements=browser.find_elements(By.XPATH,"//h3/a[u[@class='StretchedBox']]")=browser.find_elements(By.XPATH,"//h3/a[u[@class='StretchedBox']]")

Sự bất đồng của Forelem:elem inelements:

    print(elem.text)print(elem.text)

Điều này là do các trang web như thế này dựa vào JavaScript để điền vào nội dung. Các khung web nổi tiếng như AngularJS hoặc React đang đằng sau việc cung cấp năng lượng cho thể loại này. Thư viện Python, chẳng hạn như requests, không hiểu JavaScript. Do đó, bạn sẽ thấy kết quả khác nhau. Nếu dữ liệu bạn muốn tìm nạp từ web là một trong số đó, bạn có thể nghiên cứu cách JavaScript được gọi và bắt chước hành vi của trình duyệt trong chương trình của bạn. Nhưng điều này có lẽ là quá tẻ nhạt để làm cho nó hoạt động.

browser.close().close()

Một cách khác là yêu cầu một trình duyệt thực để đọc trang web thay vì sử dụng & nbsp; ________ 0. Đây là những gì Selenium có thể làm. Trước khi chúng tôi có thể sử dụng nó, chúng tôi cần cài đặt thư viện:

options=webdriver.FirefoxOptions()=webdriver.FirefoxOptions()

options.set_headless().set_headless()

browser=webdriver.Firefox(firefox_options=options)=webdriver.Firefox(firefox_options=options)

Nhưng selen chỉ là một khung để kiểm soát các trình duyệt. Bạn cần cài đặt trình duyệt trên máy tính cũng như trình điều khiển để kết nối selen với trình duyệt. Nếu bạn có ý định sử dụng Chrome, bạn cũng cần tải xuống và cài đặt Chromedriver. Bạn cần đặt trình điều khiển vào đường dẫn thực thi để selen có thể gọi nó giống như một lệnh bình thường. Ví dụ: trong Linux, bạn chỉ cần lấy text8 thực thi từ tệp zip được tải xuống và đặt nó vào text9.

Sử dụng selen khác với việc sử dụng thư viện requests trong một số khía cạnh. Đầu tiên, bạn không bao giờ có nội dung web trong mã Python của bạn trực tiếp. Thay vào đó, bạn tham khảo nội dung của trình duyệt bất cứ khi nào bạn cần. Do đó, các phần tử web được trả về bởi hàm requests3 tham khảo các đối tượng bên trong trình duyệt bên ngoài, vì vậy chúng tôi không được đóng trình duyệt trước khi chúng tôi hoàn thành việc tiêu thụ chúng. Thứ hai, tất cả các hoạt động nên dựa trên tương tác trình duyệt thay vì các yêu cầu mạng. Do đó, bạn cần kiểm soát trình duyệt bằng cách mô phỏng các chuyển động bàn phím và chuột. Nhưng đổi lại, bạn có trình duyệt đầy đủ tính năng với hỗ trợ JavaScript. Ví dụ: bạn có thể sử dụng JavaScript để kiểm tra kích thước và vị trí của một phần tử trên trang, mà bạn sẽ chỉ biết sau khi các phần tử HTML được hiển thị.

Có rất nhiều chức năng được cung cấp bởi khung Selenium mà chúng ta có thể bao gồm ở đây. Nó rất mạnh mẽ, nhưng vì nó được kết nối với trình duyệt, sử dụng nó đòi hỏi nhiều hơn thư viện requests và chậm hơn nhiều. Thông thường, đây là biện pháp cuối cùng để thu hoạch thông tin từ web.

Đọc thêm

Một thư viện thu thập thông tin nổi tiếng khác ở Python mà chúng tôi đã đề cập ở trên là phế liệu. Nó giống như kết hợp thư viện requests với BeautifulSoup thành một. Giao thức web rất phức tạp. Đôi khi chúng ta cần quản lý cookie web hoặc cung cấp thêm dữ liệu cho các yêu cầu bằng phương thức POST. Tất cả những điều này có thể được thực hiện với thư viện yêu cầu với một chức năng khác hoặc các đối số bổ sung. Sau đây là một số tài nguyên để bạn đi sâu hơn:

Bài viết

  • Tổng quan về HTTP từ MDN
  • XPath từ MDN
  • Hướng dẫn XPath từ W3Schools
  • Tham chiếu chọn CSS từ W3Schools
  • Selenium Python ràng buộc

Tài liệu API

  • Thư viện yêu cầu
  • Đẹp
  • lxml.etree
  • API Selenium Python
  • Quét

Sách

  • Python Web Scraping, Phiên bản thứ 2, bởi Katharine Jarmul và Richard Lawson
  • Web cào với Python, Phiên bản thứ 2, bởi Ryan Mitchell
  • Học Scrapy, bởi Dimitrios Kouzis-Loukas
  • Thử nghiệm Python với Selenium, bởi Sujay Raghavendra
  • Web thực hành cào bằng Python, bởi Anish Chapagain

Bản tóm tắt

Trong hướng dẫn này, bạn đã thấy các công cụ chúng ta có thể sử dụng để tìm nạp nội dung từ web.

Cụ thể, bạn đã học được:

  • Cách sử dụng thư viện yêu cầu để gửi yêu cầu HTTP và trích xuất dữ liệu từ phản hồi của nó
  • Cách xây dựng mô hình đối tượng tài liệu từ HTML để chúng tôi có thể tìm thấy một số thông tin cụ thể trên trang web
  • Cách đọc bảng trên trang web một cách nhanh chóng và dễ dàng sử dụng gấu trúc
  • Cách sử dụng Selenium để điều khiển trình duyệt để giải quyết nội dung động trên trang web

Nhận một xử lý trên Python để học máy!

Hướng dẫn python crawl data from website - dữ liệu thu thập dữ liệu python từ trang web

Tự tin hơn để viết mã trong Python

... Từ việc học các thủ thuật trăn thực tế

Khám phá cách trong ebook mới của tôi: Python cho học máy
Python for Machine Learning

Nó cung cấp các hướng dẫn tự học với hàng trăm mã làm việc để trang bị cho bạn các kỹ năng bao gồm: gỡ lỗi, hồ sơ, gõ vịt, trang trí, triển khai, và nhiều hơn nữa ...self-study tutorials with hundreds of working code to equip you with skills including:
debugging, profiling, duck typing, decorators, deployment, and much more...

Cho bạn xem hộp công cụ Python ở mức cao cho các dự án của bạn
Your Projects

Xem những gì bên trong

Làm thế nào để bạn thu thập dữ liệu từ một trang web?

Sáu bước để thu thập một trang web bao gồm:..
Hiểu cấu trúc miền ..
Định cấu hình các nguồn URL ..
Chạy kiểm tra bò ..
Thêm các hạn chế thu thập thông tin ..
Kiểm tra các thay đổi của bạn ..
Chạy bò của bạn ..

Python có thể được sử dụng cho trình thu thập thông tin web không?

Web Crawling là một kỹ thuật mạnh mẽ để thu thập dữ liệu từ web bằng cách tìm tất cả các URL cho một hoặc nhiều miền.Python có một số thư viện và khung thu thập thông tin trên web.Python has several popular web crawling libraries and frameworks.

Python có tốt cho việc cạo web không?

Phổ biến nhất: Xóa web với Python Python được coi là ngôn ngữ lập trình được sử dụng phổ biến nhất để quét web.Ngẫu nhiên, nó cũng là ngôn ngữ lập trình hàng đầu cho năm 2021 theo IEEE Spectrum.Python is regarded as the most commonly used programming language for web scraping. Incidentally, it is also the top programming language for 2021 according to IEEE Spectrum.

Làm thế nào để bạn bò trong Python?

Quy trình công việc cơ bản của một trình thu thập thông tin web chung như sau:..
Nhận URL ban đầu.....
Trong khi thu thập dữ liệu trang web, chúng ta cần tìm nạp nội dung HTML của trang, sau đó phân tích nó để lấy URL của tất cả các trang được liên kết với trang này ..
Đặt các URL này vào hàng đợi ;.