Python tự động tải xuống từ trang web

The

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1 module’s
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
3 function can launch a new browser to a specified URL. Enter the following into the interactive shell

Show

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')

A web browser tab will open to the URL http. //inventwithpython. com/ . This is about the only thing the

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1 module can do. Even so, the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
3 function does make some interesting things possible. For example, it’s tedious to copy a street address to the clipboard and bring up a map of it on Google Maps. You could take a few steps out of this task by writing a simple script to automatically launch the map in your browser using the contents of your clipboard. This way, you only have to copy the address to a clipboard and run the script, and the map will be loaded for you.

This is what your program does

  • Gets a street address from the command line arguments or clipboard

  • Opens the web browser to the Google Maps page for the address

This means your code will need to do the following

  • Read the command line arguments from

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    6

  • Read the clipboard contents

  • Call the

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    7 function to open the web browser

Open a new file editor window and save it as mapIt. py .

Step 1. Figure Out the URL

Based on the instructions in Appendix B, set up mapIt. py so that when you run it from the command line, like so.

C:\> mapit 870 Valencia St, San Francisco, CA 94110

the script will use the command line arguments instead of the clipboard. If there are no command line arguments, then the program will know to use the contents of the clipboard

First you need to figure out what URL to use for a given street address. When you load http. //maps. google. com/ in the browser and search for an address, the URL in the address bar looks something like this. https. //www. google. com/maps/place/870+Valencia+St/@37. 7590311,-122. 4215096,17z/data=. 3m1. 4b1. 4m2. 3m1. 1s0x808f7e3dadc07a37. 0xc86b0b2bb93b73d8 .

The address is in the URL, but there’s a lot of additional text there as well. Websites often add extra data to URLs to help track visitors or customize sites. But if you try just going to https. //www. google. com/maps/place/870+Valencia+St+San+Francisco+CA/ , you’ll find that it still brings up the correct page. So your program can be set to open a web browser to

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
8
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
9
(where
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
00
is the address you want to map).

Step 2. Handle the Command Line Arguments

Make your code look like this

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1

After the program’s

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
01 shebang line, you need to import the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1 module for launching the browser and import the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
03 module for reading the potential command line arguments. The
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
6 variable stores a list of the program’s filename and command line arguments. If this list has more than just the filename in it, then
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
05 evaluates to an integer greater than
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
06, meaning that command line arguments have indeed been provided

Command line arguments are usually separated by spaces, but in this case, you want to interpret all of the arguments as a single string. Since

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
6 is a list of strings, you can pass it to the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
08 method, which returns a single string value. You don’t want the program name in this string, so instead of
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
6, you should pass
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
10 to chop off the first element of the array. The final string that this expression evaluates to is stored in the
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
11 variable

If you run the program by entering this into the command line

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
3

the

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
6 variable will contain this list value

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']

Biến

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
11 sẽ chứa chuỗi
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
14

Bước 3. Xử lý Nội dung Clipboard và Khởi chạy Trình duyệt

Make your code look like the following

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
0

If there are no command line arguments, the program will assume the address is stored on the clipboard. You can get the clipboard content with

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
15 and store it in a variable named
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
11. Finally, to launch a web browser with the Google Maps URL, call
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
7

While some of the programs you write will perform huge tasks that save you hours, it can be just as satisfying to use a program that conveniently saves you a few seconds each time you perform a common task, such as getting a map of an address. Table 11-1 compares the steps needed to display a map with and without mapIt. p .

Bảng 11-1. Lấy bản đồ có và không có mapIt. p

Nhận bản đồ theo cách thủ công

Sử dụng mapIt. p

Đánh dấu địa chỉ

Đánh dấu địa chỉ

Sao chép địa chỉ

Sao chép địa chỉ

Mở trình duyệt web

Chạy mapIt. p .

Truy cập http. //bản đồ. Google. com/ .

 

Nhấp vào trường văn bản địa chỉ

 

Dán địa chỉ

 

Nhấn ENTER .

 

Xem cách mapIt. py làm cho nhiệm vụ này bớt tẻ nhạt hơn?

Ý tưởng cho các chương trình tương tự

Miễn là bạn có một URL, mô-đun

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1 cho phép người dùng bỏ qua bước mở trình duyệt và tự điều hướng đến một trang web. Các chương trình khác có thể sử dụng chức năng này để làm những việc sau

  • Mở tất cả các liên kết trên một trang trong các tab trình duyệt riêng biệt

  • Mở trình duyệt tới URL cho thời tiết địa phương của bạn

  • Mở một số trang mạng xã hội mà bạn thường xuyên kiểm tra

Tải xuống tệp từ Web với Mô-đun yêu cầu

Mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 cho phép bạn dễ dàng tải xuống các tệp từ Web mà không phải lo lắng về các vấn đề phức tạp như lỗi mạng, sự cố kết nối và nén dữ liệu. Mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 không đi kèm với Python, vì vậy bạn sẽ phải cài đặt nó trước. Từ dòng lệnh, chạy
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
51
. (Phụ lục A có thêm chi tiết về cách cài đặt các mô-đun của bên thứ ba. )

Mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 được viết vì mô-đun
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
53 của Python quá phức tạp để sử dụng. Trên thực tế, hãy lấy bút dạ vĩnh viễn và bôi đen toàn bộ đoạn văn này. Quên tôi đã từng đề cập đến
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
53. Nếu bạn cần tải xuống mọi thứ từ Web, chỉ cần sử dụng mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19

Tiếp theo, hãy thực hiện một bài kiểm tra đơn giản để đảm bảo rằng mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 đã tự cài đặt chính xác. Nhập thông tin sau vào vỏ tương tác

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
1

If no error messages show up, then the

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 module has been successfully installed

Downloading a Web Page with the requests. get() Function

Hàm

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
58 lấy một chuỗi URL để tải xuống. By calling
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
59 on
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
58’s return value, you can see that it returns a
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 object, which contains the response that the web server gave for your request. I’ll explain the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 object in more detail later, but for now, enter the following into the interactive shell while your computer is connected to the Internet

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
5

The URL goes to a text web page for the entire play of Romeo and Juliet . You can tell that the request for this web page succeeded by checking the

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
63 attribute of the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 object. If it is equal to the value of
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
65, then everything went fine ❶. (Incidentally, the status code for “OK” in the HTTP protocol is 200. You may already be familiar with the 404 status code for “Not Found. ”)

If the request succeeded, the downloaded web page is stored as a string in the

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 object’s
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
67 variable. This variable holds a large string of the entire play; the call to
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
68 shows you that it is more than 178,000 characters long. Finally, calling
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
69 displays only the first 250 characters

Checking for Errors

As you’ve seen, the

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 object has a
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
63 attribute that can be checked against
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
65 to see whether the download succeeded. A simpler way to check for success is to call the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
93 method on the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 object. This will raise an exception if there was an error downloading the file and will do nothing if the download succeeded. Enter the following into the interactive shell

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
6

The

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
93 method is a good way to ensure that a program halts if a bad download occurs. This is a good thing. You want your program to stop as soon as some unexpected error happens. If a failed download isn’t a deal breaker for your program, you can wrap the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
93 line with
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
97 and
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
98 statements to handle this error case without crashing.

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
9

This

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
93 method call causes the program to output the following

C:\> mapit 870 Valencia St, San Francisco, CA 94110
0

Always call

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
93 after calling
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
58. You want to be sure that the download has actually worked before your program continues

Saving Downloaded Files to the Hard Drive

From here, you can save the web page to a file on your hard drive with the standard

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
3 function and
C:\> mapit 870 Valencia St, San Francisco, CA 94110
03 method. There are some slight differences, though. First, you must open the file in write binary mode by passing the string
C:\> mapit 870 Valencia St, San Francisco, CA 94110
04 as the second argument to
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
3. Even if the page is in plaintext (such as the Romeo and Juliet text you downloaded earlier), you need to write binary data instead of text data in order to maintain the Unicode encoding of the text.

Unicode Encodings

Unicode encodings are beyond the scope of this book, but you can learn more about them from these web pages

  • Joel on Software. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses. ). http. //www. joelonsoftware. com/articles/Unicode. html

  • Unicode thực dụng. http. // nedbatchelder. com/text/unipain. html

To write the web page to a file, you can use a

C:\> mapit 870 Valencia St, San Francisco, CA 94110
06 loop with the
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 object’s
C:\> mapit 870 Valencia St, San Francisco, CA 94110
08 method

C:\> mapit 870 Valencia St, San Francisco, CA 94110
1

Phương thức

C:\> mapit 870 Valencia St, San Francisco, CA 94110
08 trả về “khối” nội dung trên mỗi lần lặp qua vòng lặp. Mỗi đoạn thuộc loại dữ liệu byte và bạn có thể chỉ định mỗi đoạn sẽ chứa bao nhiêu byte. Một trăm nghìn byte nói chung là một kích thước tốt, vì vậy hãy chuyển
C:\> mapit 870 Valencia St, San Francisco, CA 94110
10 làm đối số cho
C:\> mapit 870 Valencia St, San Francisco, CA 94110
08.

Tệp RomeoAndJuliet. txt hiện sẽ tồn tại trong thư mục làm việc hiện tại. Lưu ý rằng mặc dù tên tệp trên trang web là rj. txt , tệp trên ổ cứng của bạn có tên tệp khác. Mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 chỉ đơn giản xử lý việc tải xuống nội dung của các trang web. Khi trang được tải xuống, nó chỉ đơn giản là dữ liệu trong chương trình của bạn. Ngay cả khi bạn mất kết nối Internet sau khi tải xuống trang web, tất cả dữ liệu của trang vẫn sẽ nằm trên máy tính của bạn.

Phương thức

C:\> mapit 870 Valencia St, San Francisco, CA 94110
03 trả về số byte được ghi vào tệp. Trong ví dụ trước, có 100.000 byte trong đoạn đầu tiên và phần còn lại của tệp chỉ cần 78.981 byte

Để xem lại, đây là toàn bộ quá trình tải xuống và lưu tệp

  1. Gọi

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    58 để tải tệp xuống

  2. Gọi

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    3 với
    C:\> mapit 870 Valencia St, San Francisco, CA 94110
    04 để tạo tệp mới ở chế độ ghi nhị phân

  3. Lặp lại phương thức

    C:\> mapit 870 Valencia St, San Francisco, CA 94110
    08 của đối tượng
    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    61

  4. Gọi

    C:\> mapit 870 Valencia St, San Francisco, CA 94110
    03 trên mỗi lần lặp để ghi nội dung vào tệp

  5. Gọi

    C:\> mapit 870 Valencia St, San Francisco, CA 94110
    20 để đóng tệp

Đó là tất cả những gì có trong mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19. Vòng lặp
C:\> mapit 870 Valencia St, San Francisco, CA 94110
06 và công cụ
C:\> mapit 870 Valencia St, San Francisco, CA 94110
08 có vẻ phức tạp so với quy trình công việc
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
3/
C:\> mapit 870 Valencia St, San Francisco, CA 94110
03/
C:\> mapit 870 Valencia St, San Francisco, CA 94110
20 mà bạn đang sử dụng để ghi tệp văn bản, nhưng nó đảm bảo rằng mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 không ngốn quá nhiều bộ nhớ ngay cả khi bạn tải xuống các tệp lớn. Bạn có thể tìm hiểu về các tính năng khác của mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 từ http. // yêu cầu. đọcthedocs. tổ chức/ .

HTML

Trước khi chọn các trang web riêng biệt, bạn sẽ tìm hiểu một số kiến ​​thức cơ bản về HTML. Bạn cũng sẽ thấy cách truy cập các công cụ dành cho nhà phát triển mạnh mẽ của trình duyệt web, điều này sẽ giúp việc thu thập thông tin từ Web trở nên dễ dàng hơn nhiều

Tài nguyên để học HTML

Ngôn ngữ đánh dấu siêu văn bản (HTML) là định dạng mà các trang web được viết bằng. Chương này giả định rằng bạn đã có một số kinh nghiệm cơ bản với HTML, nhưng nếu bạn cần hướng dẫn cho người mới bắt đầu, tôi đề xuất một trong những trang web sau.

  • http. //html con chó. com/guides/html/người mới bắt đầu/

  • http. //www. học viện mật mã. com/bản nhạc/web/

  • https. // nhà phát triển. mozilla. org/en-US/learn/html/

Bồi dưỡng nhanh

Trong trường hợp đã lâu rồi bạn không xem bất kỳ HTML nào, đây là tổng quan nhanh về những điều cơ bản. Tệp HTML là tệp văn bản gốc có . phần mở rộng tệp html . Văn bản trong các tệp này được bao quanh bởi thẻ , là những từ được đặt trong dấu ngoặc nhọn. Các thẻ cho trình duyệt biết cách định dạng trang web. Thẻ bắt đầu và thẻ đóng có thể kèm theo một số văn bản để tạo thành một phần tử . văn bản (hoặc HTML bên trong ) là nội dung giữa phần đầu và phần . Ví dụ: HTML sau sẽ hiển thị Xin chào thế giới. trong trình duyệt, với Xin chào được in đậm.

C:\> mapit 870 Valencia St, San Francisco, CA 94110
2

HTML này sẽ giống như Hình 11-1 trong trình duyệt

Python tự động tải xuống từ trang web

Hình 11-1. Xin chào thế giới. được hiển thị trong trình duyệt

Thẻ mở đầu

C:\> mapit 870 Valencia St, San Francisco, CA 94110
29 nói rằng văn bản kèm theo sẽ được in đậm. Các thẻ đóng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
30 cho trình duyệt biết vị trí kết thúc của văn bản in đậm

Có nhiều thẻ khác nhau trong HTML. Một số thẻ này có thuộc tính bổ sung ở dạng thuộc tính trong dấu ngoặc nhọn. Ví dụ: thẻ

C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 bao gồm văn bản phải là một liên kết. URL mà văn bản liên kết đến được xác định bởi thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
32. Đây là một ví dụ.

C:\> mapit 870 Valencia St, San Francisco, CA 94110
3

HTML này sẽ giống như Hình 11-2 trong trình duyệt

Python tự động tải xuống từ trang web

Hình 11-2. Liên kết được hiển thị trong trình duyệt

Một số phần tử có thuộc tính

C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 được sử dụng để xác định duy nhất phần tử trong trang. Bạn sẽ thường hướng dẫn các chương trình của mình tìm kiếm một phần tử theo thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 của nó, do đó, việc tìm ra thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 của một phần tử bằng các công cụ dành cho nhà phát triển của trình duyệt là một nhiệm vụ phổ biến khi viết các chương trình quét web

Xem HTML nguồn của một trang web

Bạn sẽ cần xem mã nguồn HTML của các trang web mà chương trình của bạn sẽ làm việc với. Để thực hiện việc này, nhấp chuột phải (hoặc CTRL -nhấp vào OS X) bất kỳ trang web nào trong trình duyệt web của bạn và chọn View Source or View page source to see the HTML text of the page (see Figure 11-3). This is the text your browser actually receives. The browser knows how to display, or kết xuất trang web từ HTML này.

Python tự động tải xuống từ trang web

Hình 11-3. Xem nguồn của một trang web

Tôi thực sự khuyên bạn nên xem HTML nguồn của một số trang web yêu thích của bạn. Sẽ tốt thôi nếu bạn không hiểu hết những gì bạn đang thấy khi xem nguồn. Bạn sẽ không cần thông thạo HTML để viết các chương trình quét web đơn giản—xét cho cùng, bạn sẽ không viết các trang web của riêng mình. Bạn chỉ cần có đủ kiến ​​thức để chọn ra dữ liệu từ một trang web hiện có

Mở Công cụ dành cho nhà phát triển của trình duyệt của bạn

Ngoài việc xem nguồn của trang web, bạn có thể xem qua HTML của trang bằng các công cụ dành cho nhà phát triển của trình duyệt. Trong Chrome và Internet Explorer dành cho Windows, các công cụ dành cho nhà phát triển đã được cài đặt và bạn có thể nhấn F12 để chúng xuất hiện (xem Hình 11-4). Nhấn F12 một lần nữa sẽ làm cho các công cụ dành cho nhà phát triển biến mất. Trong Chrome, bạn cũng có thể hiển thị các công cụ dành cho nhà phát triển bằng cách chọn View▸Developer▸Developer Tools. Trong OS X, nhấn

Python tự động tải xuống từ trang web
- OPTION -I sẽ mở Công cụ dành cho nhà phát triển của Chrome.

Python tự động tải xuống từ trang web

Hình 11-4. Cửa sổ Công cụ dành cho nhà phát triển trong trình duyệt Chrome

Trong Firefox, bạn có thể hiển thị Trình kiểm tra công cụ dành cho nhà phát triển web bằng cách nhấn CTRL - SHIFT< . Bố cục gần giống với các công cụ dành cho nhà phát triển của Chrome. -C on Windows and Linux or by pressing ⌘-OPTION-C on OS X. The layout is almost identical to Chrome’s developer tools.

Trong Safari, hãy mở cửa sổ Tùy chọn và trên ngăn Nâng cao, hãy chọn tùy chọn Hiển thị menu Phát triển trong thanh menu . Sau khi đã được bật, bạn có thể hiển thị các công cụ dành cho nhà phát triển bằng cách nhấn

Python tự động tải xuống từ trang web
- TÙY CHỌN -I.

Sau khi bật hoặc cài đặt các công cụ dành cho nhà phát triển trong trình duyệt của mình, bạn có thể nhấp chuột phải vào bất kỳ phần nào của trang web và chọn Kiểm tra phần tử từ . Điều này sẽ hữu ích khi bạn bắt đầu phân tích cú pháp HTML cho các chương trình quét web của mình.

Không sử dụng biểu thức chính quy để phân tích cú pháp HTML

Định vị một đoạn HTML cụ thể trong một chuỗi có vẻ như là một trường hợp hoàn hảo cho các biểu thức chính quy. Tuy nhiên, tôi khuyên bạn không nên. Có nhiều cách khác nhau để HTML có thể được định dạng và vẫn được coi là HTML hợp lệ, nhưng việc cố gắng nắm bắt tất cả các biến thể có thể có này trong một biểu thức chính quy có thể rất tẻ nhạt và dễ bị lỗi. Một mô-đun được phát triển đặc biệt để phân tích cú pháp HTML, chẳng hạn như Beautiful Soup, sẽ ít có khả năng dẫn đến lỗi hơn

Bạn có thể tìm thấy một đối số mở rộng về lý do tại sao bạn không nên phân tích cú pháp HTML bằng các biểu thức chính quy tại http. // stackoverflow. com/a/1732454/1893164/ .

Sử dụng Công cụ dành cho nhà phát triển để tìm các phần tử HTML

Khi chương trình của bạn đã tải xuống một trang web bằng mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19, bạn sẽ có nội dung HTML của trang dưới dạng một giá trị chuỗi. Bây giờ bạn cần tìm ra phần nào của HTML tương ứng với thông tin trên trang web mà bạn quan tâm

Đây là nơi các công cụ dành cho nhà phát triển của trình duyệt có thể trợ giúp. Giả sử bạn muốn viết chương trình lấy dữ liệu dự báo thời tiết từ http. //thời tiết. chính phủ/ . Trước khi viết bất kỳ mã nào, hãy nghiên cứu một chút. Nếu bạn truy cập trang web và tìm kiếm mã ZIP 94105, trang web sẽ đưa bạn đến trang hiển thị dự báo cho khu vực đó.

Nếu bạn muốn thu thập thông tin nhiệt độ cho mã ZIP đó thì sao? . Điều này sẽ mở ra cửa sổ Công cụ dành cho nhà phát triển, hiển thị cho bạn HTML tạo ra phần cụ thể này của trang web. Hình 11-5 hiển thị các công cụ dành cho nhà phát triển mở ra cho HTML của nhiệt độ. CONTROL-click on OS X) and select Inspect Element from the context menu that appears. This will bring up the Developer Tools window, which shows you the HTML that produces this particular part of the web page. Figure 11-5 shows the developer tools open to the HTML of the temperature.

Python tự động tải xuống từ trang web

Hình 11-5. Kiểm tra phần tử chứa văn bản nhiệt độ bằng các công cụ dành cho nhà phát triển

Từ các công cụ dành cho nhà phát triển, bạn có thể thấy rằng HTML chịu trách nhiệm về phần nhiệt độ của trang web là

C:\> mapit 870 Valencia St, San Francisco, CA 94110
37. Đây chính xác là những gì bạn đang tìm kiếm. Có vẻ như thông tin về nhiệt độ được chứa bên trong một phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
38 với lớp
C:\> mapit 870 Valencia St, San Francisco, CA 94110
39. Bây giờ bạn đã biết mình đang tìm gì, mô-đun
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 sẽ giúp bạn tìm thấy nó trong chuỗi

Phân tích cú pháp HTML bằng Mô-đun BeautifulSoup

Beautiful Soup là một mô-đun để trích xuất thông tin từ một trang HTML (và cho mục đích này tốt hơn nhiều so với các biểu thức thông thường). Tên của mô-đun

C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 là
C:\> mapit 870 Valencia St, San Francisco, CA 94110
42 (đối với Beautiful Soup, phiên bản 4). Để cài đặt nó, bạn sẽ cần chạy
C:\> mapit 870 Valencia St, San Francisco, CA 94110
43 từ dòng lệnh. (Xem Phụ lục A để biết hướng dẫn cài đặt các mô-đun của bên thứ ba. ) Trong khi
C:\> mapit 870 Valencia St, San Francisco, CA 94110
44 là tên được sử dụng để cài đặt, để nhập Beautiful Soup, bạn chạy
C:\> mapit 870 Valencia St, San Francisco, CA 94110
45

Đối với chương này, các ví dụ về Beautiful Soup sẽ phân tích cú pháp (nghĩa là phân tích và xác định các phần của) tệp HTML trên ổ cứng . Mở một cửa sổ chỉnh sửa tệp mới trong IDLE, nhập thông tin sau và lưu dưới dạng example. html . Ngoài ra, hãy tải xuống từ http. //Không có tinh bột. com/automatestuff/ .

C:\> mapit 870 Valencia St, San Francisco, CA 94110
4

Như bạn có thể thấy, ngay cả một tệp HTML đơn giản cũng bao gồm nhiều thẻ và thuộc tính khác nhau và vấn đề nhanh chóng trở nên khó hiểu với các trang web phức tạp. Rất may, Beautiful Soup giúp làm việc với HTML dễ dàng hơn nhiều

Tạo đối tượng BeautifulSoup từ HTML

Hàm

C:\> mapit 870 Valencia St, San Francisco, CA 94110
46 cần được gọi bằng một chuỗi chứa HTML mà nó sẽ phân tích cú pháp. Hàm
C:\> mapit 870 Valencia St, San Francisco, CA 94110
46 trả về là một đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40. Nhập nội dung sau vào trình bao tương tác trong khi máy tính của bạn được kết nối với Internet

C:\> mapit 870 Valencia St, San Francisco, CA 94110
5

Mã này sử dụng

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
58 để tải xuống trang chính từ trang web No Starch Press và sau đó chuyển thuộc tính
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
67 của phản hồi tới
C:\> mapit 870 Valencia St, San Francisco, CA 94110
46. Đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 mà nó trả về được lưu trữ trong một biến có tên là
C:\> mapit 870 Valencia St, San Francisco, CA 94110
53

Bạn cũng có thể tải tệp HTML từ ổ cứng của mình bằng cách chuyển đối tượng

C:\> mapit 870 Valencia St, San Francisco, CA 94110
54 tới
C:\> mapit 870 Valencia St, San Francisco, CA 94110
46. Nhập thông tin sau vào trình bao tương tác (đảm bảo ví dụ. html nằm trong thư mục làm việc).

C:\> mapit 870 Valencia St, San Francisco, CA 94110
6

Khi bạn có một đối tượng

C:\> mapit 870 Valencia St, San Francisco, CA 94110
40, bạn có thể sử dụng các phương thức của nó để định vị các phần cụ thể của tài liệu HTML

Tìm phần tử bằng phương thức select()

Bạn có thể truy xuất phần tử trang web từ đối tượng

C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 bằng cách gọi phương thức
C:\> mapit 870 Valencia St, San Francisco, CA 94110
58 và chuyển một chuỗi bộ chọn CSS selector cho phần tử bạn . Bộ chọn giống như biểu thức chính quy. Chúng chỉ định một mẫu để tìm, trong trường hợp này, trong các trang HTML thay vì các chuỗi văn bản chung.

Phần thảo luận đầy đủ về cú pháp bộ chọn CSS nằm ngoài phạm vi của cuốn sách này (có một hướng dẫn về bộ chọn tốt trong các tài nguyên tại http. //Không có tinh bột. com/automatestuff/ ), nhưng đây là phần giới thiệu ngắn về bộ chọn. Bảng 11-2 cho biết ví dụ về các mẫu bộ chọn CSS phổ biến nhất.

Bảng 11-2. Ví dụ về Bộ chọn CSS

Bộ chọn được truyền cho phương thức

C:\> mapit 870 Valencia St, San Francisco, CA 94110
58

Sẽ phù hợp

C:\> mapit 870 Valencia St, San Francisco, CA 94110
60

Tất cả các phần tử có tên

C:\> mapit 870 Valencia St, San Francisco, CA 94110
61

C:\> mapit 870 Valencia St, San Francisco, CA 94110
62

Phần tử có thuộc tính

C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 của
C:\> mapit 870 Valencia St, San Francisco, CA 94110
64

C:\> mapit 870 Valencia St, San Francisco, CA 94110
65

Tất cả các phần tử sử dụng thuộc tính CSS

C:\> mapit 870 Valencia St, San Francisco, CA 94110
66 có tên là
C:\> mapit 870 Valencia St, San Francisco, CA 94110
67

C:\> mapit 870 Valencia St, San Francisco, CA 94110
68

Tất cả các phần tử có tên là

C:\> mapit 870 Valencia St, San Francisco, CA 94110
69 nằm trong một phần tử có tên là
C:\> mapit 870 Valencia St, San Francisco, CA 94110
61

C:\> mapit 870 Valencia St, San Francisco, CA 94110
71

Tất cả các phần tử có tên là

C:\> mapit 870 Valencia St, San Francisco, CA 94110
69 trực tiếp bên trong một phần tử có tên là
C:\> mapit 870 Valencia St, San Francisco, CA 94110
61, không có phần tử nào khác ở giữa

C:\> mapit 870 Valencia St, San Francisco, CA 94110
74

Tất cả các phần tử có tên

C:\> mapit 870 Valencia St, San Francisco, CA 94110
75 có thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
76 với bất kỳ giá trị nào

C:\> mapit 870 Valencia St, San Francisco, CA 94110
77

Tất cả các phần tử có tên

C:\> mapit 870 Valencia St, San Francisco, CA 94110
75 có thuộc tính tên là
C:\> mapit 870 Valencia St, San Francisco, CA 94110
79 với giá trị
C:\> mapit 870 Valencia St, San Francisco, CA 94110
80

Các mẫu bộ chọn khác nhau có thể được kết hợp để tạo ra các kết hợp phức tạp. Ví dụ:

C:\> mapit 870 Valencia St, San Francisco, CA 94110
81 sẽ khớp với bất kỳ phần tử nào có thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 của
C:\> mapit 870 Valencia St, San Francisco, CA 94110
64, miễn là phần tử đó cũng nằm trong phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
38

Phương thức

C:\> mapit 870 Valencia St, San Francisco, CA 94110
58 sẽ trả về một danh sách các đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
86, đó là cách Beautiful Soup đại diện cho một phần tử HTML. Danh sách sẽ chứa một đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
86 cho mỗi trận đấu trong HTML của đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40. Các giá trị thẻ có thể được chuyển đến hàm
C:\> mapit 870 Valencia St, San Francisco, CA 94110
89 để hiển thị các thẻ HTML mà chúng đại diện. Giá trị thẻ cũng có thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
90 hiển thị tất cả các thuộc tính HTML của thẻ dưới dạng từ điển. Sử dụng ví dụ. html từ trước đó, hãy nhập thông tin sau vào trình bao tương tác.

C:\> mapit 870 Valencia St, San Francisco, CA 94110
7

Mã này sẽ lấy phần tử có

C:\> mapit 870 Valencia St, San Francisco, CA 94110
91 ra khỏi HTML mẫu của chúng ta. Chúng tôi sử dụng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
92 để trả về danh sách tất cả các phần tử có
C:\> mapit 870 Valencia St, San Francisco, CA 94110
91. Chúng tôi lưu trữ danh sách các đối tượng ______786 này trong biến
C:\> mapit 870 Valencia St, San Francisco, CA 94110
95 và
C:\> mapit 870 Valencia St, San Francisco, CA 94110
96 cho chúng tôi biết có một
C:\> mapit 870 Valencia St, San Francisco, CA 94110
86
object in the list; there was one match. Calling
C:\> mapit 870 Valencia St, San Francisco, CA 94110
98 on the element returns the element’s text, or inner HTML. The text of an element is the content between the opening and closing tags: in this case,
C:\> mapit 870 Valencia St, San Francisco, CA 94110
99.

Truyền phần tử tới

C:\> mapit 870 Valencia St, San Francisco, CA 94110
89 trả về một chuỗi có thẻ bắt đầu và thẻ đóng và văn bản của phần tử. Cuối cùng,
C:\> mapit 870 Valencia St, San Francisco, CA 94110
90 cung cấp cho chúng ta một từ điển với thuộc tính của phần tử,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
102 và giá trị của thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
33,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
104

Bạn cũng có thể lấy tất cả các phần tử

C:\> mapit 870 Valencia St, San Francisco, CA 94110
38 từ đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40. Nhập cái này vào shell tương tác

C:\> mapit 870 Valencia St, San Francisco, CA 94110
8

Lần này,

C:\> mapit 870 Valencia St, San Francisco, CA 94110
58 cung cấp cho chúng tôi danh sách ba trận đấu mà chúng tôi lưu trữ trong
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
108. Sử dụng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
89 trên
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
110,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
111 và
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
112 sẽ hiển thị cho bạn từng phần tử dưới dạng chuỗi và sử dụng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
98 trên mỗi phần tử sẽ hiển thị cho bạn văn bản của nó

Lấy dữ liệu từ các thuộc tính của phần tử

Phương thức

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
114 dành cho đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
86 giúp việc truy cập các giá trị thuộc tính từ một phần tử trở nên đơn giản. Phương thức được truyền vào một chuỗi tên thuộc tính và trả về giá trị của thuộc tính đó. Sử dụng ví dụ. html , hãy nhập thông tin sau vào trình bao tương tác.

C:\> mapit 870 Valencia St, San Francisco, CA 94110
9

Ở đây, chúng tôi sử dụng

C:\> mapit 870 Valencia St, San Francisco, CA 94110
58 để tìm bất kỳ phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
69 nào và sau đó lưu trữ phần tử phù hợp đầu tiên trong
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
118. Truyền tên thuộc tính
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
102 cho
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
114 trả về giá trị của thuộc tính,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
104

Dự định. Tìm kiếm trên Google “Tôi cảm thấy may mắn”

Bất cứ khi nào tìm kiếm một chủ đề trên Google, tôi không chỉ xem một kết quả tìm kiếm tại một thời điểm. Bằng cách nhấp chuột giữa vào liên kết kết quả tìm kiếm (hoặc nhấp trong khi giữ CTRL ), tôi mở một vài liên kết đầu tiên trong một loạt tab mới để đọc sau. Tôi tìm kiếm trên Google thường xuyên đến mức quy trình làm việc này—mở trình duyệt, tìm kiếm chủ đề và nhấp chuột giữa vào từng liên kết một—thật tẻ nhạt. Sẽ thật tuyệt nếu tôi có thể chỉ cần nhập cụm từ tìm kiếm trên dòng lệnh và để máy tính của tôi tự động mở trình duyệt với tất cả các kết quả tìm kiếm hàng đầu trong các tab mới. Hãy viết một kịch bản để làm điều này.

This is what your program does

  • Nhận từ khóa tìm kiếm từ các đối số dòng lệnh

  • Truy xuất trang kết quả tìm kiếm

  • Mở tab trình duyệt cho từng kết quả

This means your code will need to do the following

  • Read the command line arguments from

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    6

  • Tìm nạp trang kết quả tìm kiếm bằng mô-đun

    >>> import webbrowser
    >>> webbrowser.open('http://inventwithpython.com/')
    19

  • Tìm các liên kết đến từng kết quả tìm kiếm

  • Call the

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    7 function to open the web browser

Mở cửa sổ chỉnh sửa tệp mới và lưu dưới dạng Lucky. p .

Bước 1. Nhận đối số dòng lệnh và yêu cầu trang tìm kiếm

Trước khi mã hóa bất cứ thứ gì, trước tiên bạn cần biết URL của trang kết quả tìm kiếm. Bằng cách nhìn vào thanh địa chỉ của trình duyệt sau khi thực hiện tìm kiếm trên Google, bạn có thể thấy rằng trang kết quả có URL như https. //www. Google. com/search?q=SEARCH_TERM_HERE . Mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 có thể tải xuống trang này và sau đó bạn có thể sử dụng Beautiful Soup để tìm các liên kết kết quả tìm kiếm trong HTML. Cuối cùng, bạn sẽ sử dụng mô-đun
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1 để mở các liên kết đó trong tab trình duyệt.

Make your code look like the following

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
10

Người dùng sẽ chỉ định cụm từ tìm kiếm bằng cách sử dụng đối số dòng lệnh khi họ khởi chạy chương trình. Các đối số này sẽ được lưu trữ dưới dạng chuỗi trong danh sách trong

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
6

Bước 2. Tìm tất cả các kết quả

Bây giờ bạn cần sử dụng Beautiful Soup để trích xuất các liên kết kết quả tìm kiếm hàng đầu từ HTML đã tải xuống của bạn. Nhưng làm thế nào để bạn tìm ra bộ chọn phù hợp cho công việc? . Thay vào đó, bạn phải kiểm tra trang kết quả tìm kiếm bằng các công cụ dành cho nhà phát triển của trình duyệt để cố gắng tìm bộ chọn chỉ chọn ra các liên kết bạn muốn

Sau khi thực hiện tìm kiếm Beautiful Soup trên Google, bạn có thể mở công cụ dành cho nhà phát triển của trình duyệt và kiểm tra một số thành phần liên kết trên trang. Chúng trông cực kỳ phức tạp, đại loại như thế này.

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
129.

Không thành vấn đề khi phần tử trông cực kỳ phức tạp. Bạn chỉ cần tìm mẫu mà tất cả các liên kết kết quả tìm kiếm có. Nhưng phần tử

C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 này không có bất kỳ điểm gì dễ dàng phân biệt nó với phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 không thuộc kết quả tìm kiếm trên trang

Make your code look like the following

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
11

Tuy nhiên, nếu bạn tra cứu một chút từ phần tử

C:\> mapit 870 Valencia St, San Francisco, CA 94110
31, thì có một phần tử như thế này.
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
133. Nhìn qua phần còn lại của nguồn HTML, có vẻ như lớp
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
134 chỉ được sử dụng cho các liên kết kết quả tìm kiếm. Bạn không cần phải biết lớp CSS
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
134 là gì hoặc nó làm gì. Bạn sẽ chỉ sử dụng nó làm điểm đánh dấu cho phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 mà bạn đang tìm kiếm. Bạn có thể tạo một đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 từ văn bản HTML của trang đã tải xuống, sau đó sử dụng bộ chọn
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
138 để tìm tất cả các phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 nằm trong một phần tử có lớp CSS
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
134

Bước 3. Mở trình duyệt web cho từng kết quả

Cuối cùng, chúng tôi sẽ yêu cầu chương trình mở các tab trình duyệt web để biết kết quả của chúng tôi. Thêm phần sau vào cuối chương trình của bạn

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
12

Theo mặc định, bạn mở năm kết quả tìm kiếm đầu tiên trong các tab mới bằng cách sử dụng mô-đun

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1. Tuy nhiên, người dùng có thể đã tìm kiếm thứ gì đó có ít hơn năm kết quả. Cuộc gọi
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
142 trả về một danh sách tất cả các phần tử phù hợp với bộ chọn
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
138 của bạn, vì vậy số lượng tab bạn muốn mở là
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
144 hoặc độ dài của danh sách này (tùy theo giá trị nào nhỏ hơn)

Hàm Python tích hợp sẵn

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
145 trả về giá trị nhỏ nhất trong số các đối số số nguyên hoặc số thực mà nó được truyền vào. (Ngoài ra còn có một hàm
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
146 tích hợp trả về đối số lớn nhất mà nó được truyền vào. ) Bạn có thể sử dụng
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
145 để tìm hiểu xem có ít hơn năm liên kết trong danh sách hay không và lưu trữ số lượng liên kết sẽ mở trong một biến có tên là
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
148. Sau đó, bạn có thể chạy qua vòng lặp
C:\> mapit 870 Valencia St, San Francisco, CA 94110
06 bằng cách gọi
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
150

Trên mỗi lần lặp của vòng lặp, bạn sử dụng

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
7 để mở một tab mới trong trình duyệt web. Lưu ý rằng giá trị của thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
32 trong các phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 được trả về không có phần đầu tiên của
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
154, vì vậy bạn phải nối giá trị đó với giá trị chuỗi của thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
32

Giờ đây, bạn có thể mở ngay 5 kết quả đầu tiên trên Google cho hướng dẫn lập trình Python bằng cách chạy

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
156 trên dòng lệnh. (Xem Phụ lục B để biết cách dễ dàng chạy các chương trình trên hệ điều hành của bạn. )

Ý tưởng cho các chương trình tương tự

Lợi ích của việc duyệt theo tab là bạn có thể dễ dàng mở các liên kết trong các tab mới để đọc sau. Một chương trình tự động mở nhiều liên kết cùng lúc có thể là một phím tắt hay để thực hiện các thao tác sau

  • Mở tất cả các trang sản phẩm sau khi tìm kiếm một trang web mua sắm như Amazon

  • Mở tất cả các liên kết để đánh giá cho một sản phẩm

  • Mở liên kết kết quả tới ảnh sau khi thực hiện tìm kiếm trên trang ảnh như Flickr hoặc Imgur

Dự định. Tải xuống tất cả truyện tranh XKCD

Các blog và các trang web cập nhật thường xuyên khác thường có trang nhất với bài đăng gần đây nhất cũng như nút Trước đó trên trang đưa bạn đến bài đăng trước đó. Sau đó, bài đăng đó cũng sẽ có nút Trước đó, v.v., tạo đường dẫn từ trang gần đây nhất đến bài đăng đầu tiên trên trang web. Nếu bạn muốn có một bản sao nội dung của trang web để đọc khi không trực tuyến, bạn có thể điều hướng qua từng trang theo cách thủ công và lưu từng trang. Nhưng đây là công việc khá nhàm chán, vì vậy hãy viết một chương trình để làm việc đó

XKCD là một webcomic nổi tiếng dành cho giới đam mê máy tính với trang web phù hợp với cấu trúc này (xem Hình 11-6). Trang đầu tại http. //xkcd. com/ có nút Trước hướng dẫn người dùng quay lại các truyện tranh trước đó. Tải xuống từng truyện tranh bằng tay sẽ mất nhiều thời gian, nhưng bạn có thể viết một kịch bản để thực hiện việc này trong vài phút.

Đây là những gì chương trình của bạn làm

  • Tải trang chủ XKCD

  • Lưu hình ảnh truyện tranh trên trang đó

  • Theo liên kết Truyện tranh trước

  • Lặp lại cho đến khi đến truyện tranh đầu tiên

Python tự động tải xuống từ trang web

Hình 11-6. XKCD, “một webcomic lãng mạn, châm biếm, toán học và ngôn ngữ”

This means your code will need to do the following

  • Tải xuống các trang có mô-đun

    >>> import webbrowser
    >>> webbrowser.open('http://inventwithpython.com/')
    19

  • Tìm URL của hình ảnh truyện tranh cho một trang bằng Beautiful Soup

  • Tải xuống và lưu hình ảnh truyện tranh vào ổ cứng với

    C:\> mapit 870 Valencia St, San Francisco, CA 94110
    08

  • Tìm URL của liên kết Truyện tranh trước đó và lặp lại

Mở cửa sổ chỉnh sửa tệp mới và lưu dưới dạng downloadXkcd. p .

Bước 1. Thiết kế chương trình

Nếu bạn mở công cụ dành cho nhà phát triển của trình duyệt và kiểm tra các thành phần trên trang, bạn sẽ thấy thông tin sau

  • URL của tệp hình ảnh truyện tranh được cung cấp bởi thuộc tính

    C:\> mapit 870 Valencia St, San Francisco, CA 94110
    32 của phần tử
    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    160

  • Phần tử

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    160 nằm bên trong phần tử
    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    162

  • Nút Prev có thuộc tính HTML

    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    163 với giá trị
    ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
    164

  • Nút Trước của truyện tranh đầu tiên liên kết đến http. //xkcd. com/# URL, cho biết rằng không còn trang trước đó nữa.

Make your code look like the following

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
13

Bạn sẽ có một biến

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
165 bắt đầu bằng giá trị
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
166 và liên tục cập nhật nó (trong vòng lặp
C:\> mapit 870 Valencia St, San Francisco, CA 94110
06) với URL của liên kết Prev của trang hiện tại. Ở mỗi bước trong vòng lặp, bạn sẽ tải xuống truyện tranh tại
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
165. Bạn sẽ biết kết thúc vòng lặp khi
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
165 kết thúc bằng
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
170

Bạn sẽ tải các tệp hình ảnh xuống một thư mục trong thư mục làm việc hiện tại có tên xkcd . Cuộc gọi

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
171 đảm bảo rằng thư mục này tồn tại và đối số từ khóa
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
172 ngăn hàm ném ngoại lệ nếu thư mục này đã tồn tại. Phần còn lại của mã chỉ là nhận xét phác thảo phần còn lại của chương trình của bạn.

Bước 2. Tải xuống trang web

Hãy triển khai mã để tải xuống trang. Làm cho mã của bạn trông giống như sau

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
14

Đầu tiên, in

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
165 để người dùng biết chương trình sắp tải xuống URL nào; . Như mọi khi, bạn ngay lập tức gọi phương thức
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
93 của đối tượng
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
61 để đưa ra một ngoại lệ và kết thúc chương trình nếu có lỗi xảy ra với quá trình tải xuống. Nếu không, bạn tạo một đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 từ văn bản của trang đã tải xuống

Bước 3. Tìm và tải xuống hình ảnh truyện tranh

Make your code look like the following

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
15

Từ việc kiểm tra trang chủ XKCD bằng các công cụ dành cho nhà phát triển của bạn, bạn biết rằng phần tử

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
160 cho hình ảnh truyện tranh nằm bên trong phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
61 với thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 được đặt thành
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
182, vì vậy bộ chọn
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
183 sẽ lấy cho bạn phần tử
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
160 chính xác từ đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40

Một số trang XKCD có nội dung đặc biệt không phải là tệp hình ảnh đơn giản. Tốt rồi; . Nếu bộ chọn của bạn không tìm thấy bất kỳ phần tử nào, thì

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
186 sẽ trả về một danh sách trống. Khi điều đó xảy ra, chương trình chỉ có thể in một thông báo lỗi và tiếp tục mà không cần tải xuống hình ảnh

Nếu không, bộ chọn sẽ trả về một danh sách chứa một phần tử

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
160. Bạn có thể lấy thuộc tính
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
188 từ phần tử
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
160 này và chuyển nó cho
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
58 để tải xuống tệp hình ảnh của truyện tranh

Bước 4. Lưu hình ảnh và tìm truyện tranh trước đó

Make your code look like the following

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
16

Lúc này, file ảnh của truyện tranh được lưu trữ trong biến

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
191. Bạn cần ghi dữ liệu hình ảnh này vào một tệp trên ổ cứng

Bạn sẽ cần một tên tệp cho tệp hình ảnh cục bộ để chuyển đến

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
3.
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
193 sẽ có giá trị như
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
194—mà bạn có thể nhận thấy trông rất giống đường dẫn tệp. Và trên thực tế, bạn có thể gọi
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
195 với
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
193 và nó sẽ chỉ trả về phần cuối cùng của URL,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
197. Bạn có thể sử dụng tên này làm tên tệp khi lưu hình ảnh vào ổ cứng của mình. Bạn nối tên này với tên của thư mục
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
198 bằng cách sử dụng
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
199 để chương trình của bạn sử dụng dấu gạch chéo ngược (
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
300) trên Windows và dấu gạch chéo xuôi (
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
301) trên OS X và Linux. Bây giờ bạn cuối cùng đã có tên tệp, bạn có thể gọi
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
3 để mở một tệp mới ở chế độ "ghi nhị phân" của
C:\> mapit 870 Valencia St, San Francisco, CA 94110
04

Hãy nhớ từ đầu chương này rằng để lưu các tệp bạn đã tải xuống bằng Yêu cầu, bạn cần lặp lại giá trị trả về của phương thức

C:\> mapit 870 Valencia St, San Francisco, CA 94110
08. Đoạn mã trong vòng lặp
C:\> mapit 870 Valencia St, San Francisco, CA 94110
06 ghi ra các đoạn dữ liệu hình ảnh (tối đa 100.000 byte mỗi đoạn) vào tệp và sau đó bạn đóng tệp. Hình ảnh hiện đã được lưu vào ổ cứng của bạn

Sau đó, bộ chọn

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
306 xác định phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 với thuộc tính
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
163 được đặt thành
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
164 và bạn có thể sử dụng thuộc tính
C:\> mapit 870 Valencia St, San Francisco, CA 94110
32 của phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 này để lấy URL của truyện tranh trước đó, được lưu trữ trong
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
165. Sau đó, vòng lặp
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
313 bắt đầu lại toàn bộ quá trình tải xuống cho truyện tranh này

Đầu ra của chương trình này sẽ trông như thế này

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
17

Dự án này là một ví dụ điển hình về chương trình có thể tự động đi theo các liên kết để thu thập một lượng lớn dữ liệu từ Web. Bạn có thể tìm hiểu về các tính năng khác của Beautiful Soup từ tài liệu của nó tại http. //www. vụn vặt. com/software/BeautifulSoup/bs4/doc/.

Ý tưởng cho các chương trình tương tự

Các trang tải xuống và các liên kết sau là cơ sở của nhiều chương trình thu thập thông tin trên web. Các chương trình tương tự cũng có thể làm như sau

  • Sao lưu toàn bộ trang web bằng cách theo tất cả các liên kết của nó

  • Sao chép tất cả các tin nhắn từ một diễn đàn web

  • Sao chép danh mục các mặt hàng để bán trên một cửa hàng trực tuyến

Các mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 và
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 rất tuyệt vời miễn là bạn có thể tìm ra URL mà bạn cần chuyển đến
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
58. However, sometimes this isn’t so easy to find. Or perhaps the website you want your program to navigate requires you to log in first. Mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317 sẽ cung cấp cho chương trình của bạn sức mạnh để thực hiện các tác vụ phức tạp như vậy

Controlling the Browser with the selenium Module

The

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317 module lets Python directly control the browser by programmatically clicking links and filling in login information, almost as though there is a human user interacting with the page. Selenium cho phép bạn tương tác với các trang web theo cách nâng cao hơn nhiều so với Requests và Beautiful Soup;

Phụ lục A có các bước chi tiết hơn về cài đặt mô-đun của bên thứ ba

Starting a Selenium-Controlled Browser

Đối với những ví dụ này, bạn sẽ cần có trình duyệt web Firefox. Đây sẽ là trình duyệt mà bạn kiểm soát. Nếu chưa có Firefox, bạn có thể tải xuống miễn phí từ http. //getfirefox. com/ .

Importing the modules for Selenium is slightly tricky. Instead of

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
319, you need to run
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
320. (The exact reason why the
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317 module is set up this way is beyond the scope of this book. ) After that, you can launch the Firefox browser with Selenium. Enter the following into the interactive shell

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
18

You’ll notice when

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
322 is called, the Firefox web browser starts up. Calling
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
59 on the value
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
322 reveals it’s of the
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
325 data type. And calling
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
326 directs the browser to http. //inventwithpython. com/ . Your browser should look something like Figure 11-7.

Python tự động tải xuống từ trang web

Figure 11-7. Sau khi gọi

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
322 và
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
114 trong IDLE, trình duyệt Firefox xuất hiện

Tìm phần tử trên trang

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
325 đối tượng có khá nhiều phương pháp để tìm các thành phần trên một trang. Chúng được chia thành các phương pháp
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
330 và
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
331. Các phương thức
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
330 trả về một đối tượng
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
333 duy nhất, đại diện cho phần tử đầu tiên trên trang phù hợp với truy vấn của bạn. Các phương thức
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
331 trả về danh sách các đối tượng
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
335 cho mọi phần tử phù hợp trên trang.

Bảng 11-3 cho thấy một số ví dụ về các phương thức

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
330 và
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
331 được gọi trên một đối tượng
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
325 được lưu trữ trong biến
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
339

Bảng 11-3. Selenium's

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
325 Phương pháp tìm phần tử

Tên phương thức

Đối tượng/danh sách WebElement được trả về

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
19

Các phần tử sử dụng lớp CSS

C:\> mapit 870 Valencia St, San Francisco, CA 94110
76

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
30

Các phần tử phù hợp với CSS

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
342

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
31

Các phần tử có giá trị thuộc tính ____733 phù hợp

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
32

C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 phần tử hoàn toàn khớp với
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
67
được cung cấp

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
33

C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 phần tử chứa
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
67
được cung cấp

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
34

Các phần tử có giá trị thuộc tính ______776 phù hợp

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
35

Các phần tử có thẻ phù hợp

C:\> mapit 870 Valencia St, San Francisco, CA 94110
76 (không phân biệt chữ hoa chữ thường; một phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 được khớp bởi
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
351 và
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
352)

Ngoại trừ các phương thức

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
353, các đối số của tất cả các phương thức đều phân biệt chữ hoa chữ thường. Nếu không có phần tử nào tồn tại trên trang phù hợp với những gì phương thức đang tìm kiếm, mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317 sẽ đưa ra một ngoại lệ
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
355. Nếu bạn không muốn ngoại lệ này làm hỏng chương trình của mình, hãy thêm các câu lệnh
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
97 và
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
98 vào mã của bạn

Sau khi có đối tượng

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
333, bạn có thể tìm hiểu thêm về đối tượng đó bằng cách đọc các thuộc tính hoặc gọi các phương thức trong Bảng 11-4

Bảng 11-4. Thuộc tính và phương thức WebElement

Thuộc tính hoặc phương thức

Sự miêu tả

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
359

Tên thẻ, chẳng hạn như

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
351 cho phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
362
C:\> mapit 870 Valencia St, San Francisco, CA 94110
76
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
364

Giá trị cho thuộc tính

C:\> mapit 870 Valencia St, San Francisco, CA 94110
76 của phần tử

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
67

Văn bản trong phần tử, chẳng hạn như

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
367 trong
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
368

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
369

Đối với các thành phần trường văn bản hoặc vùng văn bản, hãy xóa văn bản đã nhập vào đó

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
370

Trả về

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
371 nếu phần tử hiển thị;

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
373

Đối với các phần tử đầu vào, trả về

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
371 nếu phần tử được bật;

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
376

Đối với phần tử hộp kiểm hoặc nút radio, trả về

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
371 nếu phần tử được chọn;

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
379

Một từ điển có khóa

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
380 và
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
381 cho vị trí của phần tử trong trang

Ví dụ: mở trình chỉnh sửa tệp mới và nhập chương trình sau

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
36

Ở đây chúng tôi mở Firefox và hướng nó đến một URL. Trên trang này, chúng tôi cố gắng tìm các phần tử có tên lớp

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
382 và nếu tìm thấy một phần tử như vậy, chúng tôi sẽ in tên thẻ của nó bằng thuộc tính
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
359. Nếu không tìm thấy phần tử nào như vậy, chúng tôi sẽ in một thông báo khác

Chương trình này sẽ xuất ra như sau

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
37

Chúng tôi đã tìm thấy một phần tử có tên lớp

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
382 và tên thẻ
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
385

Nhấp vào trang

Các đối tượng

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
333 được trả về từ các phương thức
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
330 và
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
331 có một phương thức
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
389 mô phỏng thao tác nhấp chuột vào phần tử đó. Phương pháp này có thể được sử dụng để theo liên kết, thực hiện lựa chọn trên nút radio, nhấp vào nút Gửi hoặc kích hoạt bất kỳ điều gì khác có thể xảy ra khi phần tử được nhấp bằng chuột. Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
38

Thao tác này sẽ mở Firefox tới http. // phát minh với trăn. com/ , lấy đối tượng

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
333 cho phần tử
C:\> mapit 870 Valencia St, San Francisco, CA 94110
31 với văn bản Đọc trực tuyến , sau đó mô phỏng cách nhấp vào đó . Nó giống như nếu bạn tự nhấp vào liên kết; .

Điền vào và gửi biểu mẫu

Gửi tổ hợp phím đến các trường văn bản trên trang web là vấn đề tìm phần tử

C:\> mapit 870 Valencia St, San Francisco, CA 94110
75 hoặc
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
394 cho trường văn bản đó và sau đó gọi phương thức
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
395. Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
39

Miễn là Gmail chưa thay đổi

C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 của các trường văn bản Tên người dùng và Mật khẩu kể từ khi cuốn sách này được xuất bản, mã trước đó sẽ điền vào các trường văn bản đó bằng văn bản được cung cấp. (Bạn luôn có thể sử dụng trình kiểm tra của trình duyệt để xác minh
C:\> mapit 870 Valencia St, San Francisco, CA 94110
33. ) Gọi phương thức
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
398 trên bất kỳ phần tử nào sẽ có kết quả giống như nhấp vào nút Gửi cho biểu mẫu chứa phần tử đó. (Bạn có thể gọi một cách dễ dàng là
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
399, và mã sẽ làm điều tương tự. )

Gửi các phím đặc biệt

Selenium có một mô-đun cho các phím bàn phím không thể nhập vào giá trị chuỗi, có chức năng giống như các ký tự thoát. Các giá trị này được lưu trữ trong các thuộc tính trong mô-đun

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
00. Vì đó là một tên mô-đun dài, nên việc chạy
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
01 ở đầu chương trình của bạn sẽ dễ dàng hơn nhiều; . Bảng 11-5 liệt kê các biến
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
02 thường được sử dụng

Bảng 11-5. Các biến thường được sử dụng trong Mô-đun

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
00

Thuộc tính

ý nghĩa

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
06,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
07,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
08,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
09

Các phím mũi tên bàn phím

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
10,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
11

Các phím ENTERRETURN keys

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
12,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
13,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
14,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
15

Các phím ________ 016, ________ 017, ________ 018 và ________ 019

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
20,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
21,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
22

The ESC , BACKSPACEDELETE keys

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
23,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
24,. ,
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
25

Các phím F1 đến F12 ở đầu bàn phím

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
26

Phím TAB key

Ví dụ: nếu con trỏ hiện không ở trong trường văn bản, hãy nhấn HOME . Nhập thông tin sau vào trình bao tương tác và chú ý cách lệnh gọi

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
395 cuộn trang. keys will scroll the browser to the top and bottom of the page, respectively. Enter the following into the interactive shell, and notice how the
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
395 calls scroll the page:

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
0

Thẻ

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
28> là thẻ cơ sở trong tệp HTML. Toàn bộ nội dung của tệp HTML được đính kèm trong các thẻ
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
29 và
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
30. Gọi
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
31 là một nơi tốt để gửi chìa khóa đến trang web chung. Điều này sẽ hữu ích nếu, chẳng hạn như nội dung mới được tải sau khi bạn cuộn xuống cuối trang

Nhấp vào nút trình duyệt

Selenium cũng có thể mô phỏng các lần nhấp vào các nút trình duyệt khác nhau thông qua các phương pháp sau

  • ____032 . Nhấp vào nút Quay lại.

  • ______033 . Nhấp vào nút Chuyển tiếp.

  • ____034 . Nhấp vào nút Làm mới/Tải lại.

  • ____035 . Nhấp vào nút Đóng cửa sổ.

Thông tin thêm về Selenium

Selenium có thể làm được nhiều hơn thế ngoài các chức năng được mô tả ở đây. Nó có thể sửa đổi cookie của trình duyệt của bạn, chụp ảnh màn hình của các trang web và chạy JavaScript tùy chỉnh. Để tìm hiểu thêm về các tính năng này, bạn có thể truy cập tài liệu Selenium tại http. // Selenium-python. đọcthedocs. tổ chức/ .

Tóm lược

Hầu hết các tác vụ nhàm chán không giới hạn ở các tệp trên máy tính của bạn. Khả năng tải xuống các trang web theo chương trình sẽ mở rộng các chương trình của bạn ra Internet. Mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19 giúp việc tải xuống trở nên đơn giản và với một số kiến ​​thức cơ bản về các khái niệm và bộ chọn HTML, bạn có thể sử dụng mô-đun
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 để phân tích cú pháp các trang bạn tải xuống

Nhưng để tự động hóa hoàn toàn mọi tác vụ dựa trên web, bạn cần kiểm soát trực tiếp trình duyệt web của mình thông qua mô-đun

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317. Mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317 sẽ cho phép bạn đăng nhập vào các trang web và tự động điền vào biểu mẫu. Vì trình duyệt web là cách phổ biến nhất để gửi và nhận thông tin qua Internet, nên đây là một khả năng tuyệt vời cần có trong bộ công cụ lập trình của bạn

câu hỏi thực hành


Q

1. Mô tả ngắn gọn sự khác biệt giữa các mô-đun

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
1,
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
19,
C:\> mapit 870 Valencia St, San Francisco, CA 94110
40 và
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317

Q

2. Loại đối tượng nào được trả về bởi

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
58?

Q

3. Phương pháp Yêu cầu nào kiểm tra xem quá trình tải xuống có hoạt động không?

Q

4. Làm cách nào bạn có thể lấy mã trạng thái HTTP của phản hồi Yêu cầu?

Q

5. Làm cách nào để bạn lưu phản hồi Yêu cầu vào một tệp?

Q

6. Phím tắt để mở công cụ dành cho nhà phát triển của trình duyệt là gì?

Q

7. Làm cách nào bạn có thể xem (trong công cụ dành cho nhà phát triển) HTML của một thành phần cụ thể trên trang web?

Q

8. Chuỗi bộ chọn CSS sẽ tìm phần tử có thuộc tính

C:\> mapit 870 Valencia St, San Francisco, CA 94110
33 của
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
46 là gì?

Q

9. Chuỗi bộ chọn CSS sẽ tìm thấy các phần tử có lớp CSS là

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
47 là gì?

Q

10. Chuỗi bộ chọn CSS sẽ tìm thấy tất cả các phần tử ________ 761 bên trong một phần tử ________ 761 khác là gì?

Q

11. Chuỗi bộ chọn CSS sẽ tìm thấy phần tử

['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
50 với thuộc tính
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
51 được đặt thành
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
52 là gì?

Q

12. Giả sử bạn có một đối tượng Beautiful Soup

C:\> mapit 870 Valencia St, San Francisco, CA 94110
86 được lưu trữ trong biến
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
54 cho phần tử
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
55. Làm thế nào bạn có thể nhận được một chuỗi
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
56 từ đối tượng
C:\> mapit 870 Valencia St, San Francisco, CA 94110
86?

Q

13. Bạn sẽ lưu trữ tất cả các thuộc tính của một đối tượng Beautiful Soup

C:\> mapit 870 Valencia St, San Francisco, CA 94110
86 trong một biến có tên là
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
59 như thế nào?

Q

14. Chạy

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
319 không hoạt động. Làm cách nào để bạn nhập mô-đun
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
317 đúng cách?

Q

15. Sự khác biệt giữa các phương pháp

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
330 và
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
331 là gì?

Q

16. Các đối tượng

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
333 của Selenium có những phương pháp nào để mô phỏng các lần nhấp chuột và các phím trên bàn phím?

Q

17. Bạn có thể gọi ________ 065 trên nút Gửi đối tượng ________ 2333, nhưng cách dễ dàng hơn để gửi biểu mẫu với Selenium là gì?

Q

18. Làm cách nào bạn có thể mô phỏng cách nhấp vào các nút Chuyển tiếp, Quay lại và Làm mới của trình duyệt bằng Selenium?

Dự án thực hành

Để thực hành, hãy viết chương trình để thực hiện các nhiệm vụ sau

Trình gửi email dòng lệnh

Viết chương trình lấy địa chỉ email và chuỗi văn bản trên dòng lệnh, sau đó, sử dụng Selenium, đăng nhập vào tài khoản email của bạn và gửi email có chuỗi văn bản đến địa chỉ được cung cấp. (Bạn có thể muốn thiết lập một tài khoản email riêng cho chương trình này. )

Đây sẽ là một cách hay để thêm tính năng thông báo vào chương trình của bạn. Bạn cũng có thể viết một chương trình tương tự để gửi tin nhắn từ tài khoản Facebook hoặc Twitter

Trình tải xuống trang web hình ảnh

Viết chương trình truy cập trang chia sẻ ảnh như Flickr hoặc Imgur, tìm kiếm danh mục ảnh rồi tải xuống tất cả các ảnh thu được. Bạn có thể viết một chương trình hoạt động với bất kỳ trang ảnh nào có tính năng tìm kiếm

2048

2048 là một trò chơi đơn giản trong đó bạn kết hợp các ô bằng cách trượt chúng lên, xuống, sang trái hoặc sang phải bằng các phím mũi tên. Bạn thực sự có thể đạt điểm khá cao bằng cách liên tục trượt đi trượt lại theo mô hình lên, phải, xuống và trái. Viết chương trình mở trò chơi tại https. //gabrielecirulli. github. io/2048/ và tiếp tục gửi các lần nhấn phím lên, phải, xuống và trái để tự động chơi trò chơi.

Xác minh liên kết

Viết một chương trình, cung cấp URL của một trang web, sẽ cố gắng tải xuống mọi trang được liên kết trên trang. Chương trình sẽ gắn cờ bất kỳ trang nào có mã trạng thái 404 “Không tìm thấy” và in chúng ra dưới dạng các liên kết bị hỏng

Làm cách nào để tự động tải xuống tệp từ trang web bằng Python?

Để tải xuống tệp từ một URL bằng Python, hãy làm theo ba bước sau. .
Cài đặt mô-đun yêu cầu và nhập nó vào dự án của bạn
sử dụng yêu cầu. get() để tải xuống dữ liệu đằng sau URL đó
Ghi tệp vào một tệp trong hệ thống của bạn bằng cách gọi open()

Làm cách nào để tải xuống dữ liệu từ trang web bằng Python?

Để trích xuất dữ liệu bằng cách sử dụng quét web với python, bạn cần làm theo các bước cơ bản sau. .
Tìm URL mà bạn muốn cạo
Kiểm tra trang
Tìm dữ liệu bạn muốn trích xuất
Viết mã
Chạy mã và giải nén dữ liệu
Lưu trữ dữ liệu ở định dạng cần thiết

Tôi có thể sử dụng power automate để tải xuống tệp từ trang web không?

Tất cả những gì bạn phải làm là ghi lại các hành động sẽ đưa bạn đến tệp và thao tác đó sẽ thực hiện . Chỉ cần nhấp vào “Recorder”, khởi động trình duyệt Chrome mới và ghi lại hành động của bạn. Các tệp của bạn sẽ được tải xuống ngay sau khi nhấp vào nút hoặc liên kết tải xuống.

Làm cách nào để tự động hóa trang web bằng Python?

1. 1 Liên kết Selenium trong Python. Các liên kết Selenium Python cung cấp API thuận tiện để truy cập Trình điều khiển web Selenium như Firefox, Chrome, v.v. Pip cài đặt Selenium
1. 2 trình điều khiển web. Selenium yêu cầu trình điều khiển web để giao tiếp với trình duyệt đã chọn. Trình điều khiển web là một gói để tương tác với trình duyệt web