Là một cái nhìn tổng quan, bạn sẽ cần phải thực hiện bốn nhiệm vụ chính:
- để gửi yêu cầu (s) đến trang web,
- để lấy phản ứng (s) từ trang web
- để phân tích những phản ứng
- có một số logic để lặp trong các nhiệm vụ trên, với các thông số liên quan đến việc chuyển hướng (vào các trang web "bên cạnh" trong danh sách kết quả)
Yêu cầu http và xử lý phản hồi được thực hiện với các phương thức và lớp học từ thư viện chuẩn của Python là urllib và urllib2. Các phân tích của các trang html có thể được thực hiện với HTMLParser hoặc với các module khác như Beautiful Soup
Đoạn sau thư viện chuẩn của Python của chứng minh yêu cầu và nhận của một tìm kiếm tại địa điểm chỉ định trong câu hỏi.Trang web này được định hướng ASP và kết quả là chúng tôi cần đảm bảo rằng chúng tôi gửi một số trường biểu mẫu, một số trường có giá trị 'khủng khiếp' vì chúng được sử dụng bởi logic ASP để duy trì trạng thái và xác thực yêu cầu ở một mức độ nào đó. Thực sự gửi. Các yêu cầu phải được gửi với phương thức http POST http POST vì đây là những gì được mong đợi từ ứng dụng ASP này. Khó khăn chính là xác định trường biểu mẫu và các giá trị liên quan mà ASP mong đợi (việc nhận các trang bằng Python là phần dễ dàng).
Mã này là chức năng hoặc chính xác hơn, là chức năng, cho đến khi tôi xóa hầu hết giá trị VSTATE và có thể giới thiệu lỗi đánh máy hoặc hai bằng cách thêm nhận xét.
import urllib
import urllib2
uri = 'http://legistar.council.nyc.gov/Legislation.aspx'
#the http headers are useful to simulate a particular browser (some sites deny
#access to non-browsers (bots, etc.)
#also needed to pass the content type.
headers = {
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13',
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8',
'Content-Type': 'application/x-www-form-urlencoded'
}
# we group the form fields and their values in a list (any
# iterable, actually) of name-value tuples. This helps
# with clarity and also makes it easy to later encoding of them.
formFields = (
# the viewstate is actualy 800+ characters in length! I truncated it
# for this sample code. It can be lifted from the first page
# obtained from the site. It may be ok to hardcode this value, or
# it may have to be refreshed each time/each day, by essentially
# running an extra page request and parse, for this specific value.
(r'__VSTATE', r'7TzretNIlrZiKb7EOB3AQE ... ...2qd6g5xD8CGXm5EftXtNPt+H8B'),
# following are more of these ASP form fields
(r'__VIEWSTATE', r''),
(r'__EVENTVALIDATION', r'/wEWDwL+raDpAgKnpt8nAs3q+pQOAs3q/pQOAs3qgpUOAs3qhpUOAoPE36ANAve684YCAoOs79EIAoOs89EIAoOs99EIAoOs39EIAoOs49EIAoOs09EIAoSs99EI6IQ74SEV9n4XbtWm1rEbB6Ic3/M='),
(r'ctl00_RadScriptManager1_HiddenField', ''),
(r'ctl00_tabTop_ClientState', ''),
(r'ctl00_ContentPlaceHolder1_menuMain_ClientState', ''),
(r'ctl00_ContentPlaceHolder1_gridMain_ClientState', ''),
#but then we come to fields of interest: the search
#criteria the collections to search from etc.
# Check boxes
(r'ctl00$ContentPlaceHolder1$chkOptions$0', 'on'), # file number
(r'ctl00$ContentPlaceHolder1$chkOptions$1', 'on'), # Legislative text
(r'ctl00$ContentPlaceHolder1$chkOptions$2', 'on'), # attachement
# etc. (not all listed)
(r'ctl00$ContentPlaceHolder1$txtSearch', 'york'), # Search text
(r'ctl00$ContentPlaceHolder1$lstYears', 'All Years'), # Years to include
(r'ctl00$ContentPlaceHolder1$lstTypeBasic', 'All Types'), #types to include
(r'ctl00$ContentPlaceHolder1$btnSearch', 'Search Legislation') # Search button itself
)
# these have to be encoded
encodedFields = urllib.urlencode(formFields)
req = urllib2.Request(uri, encodedFields, headers)
f= urllib2.urlopen(req) #that's the actual call to the http site.
# *** here would normally be the in-memory parsing of f
# contents, but instead I store this to file
# this is useful during design, allowing to have a
# sample of what is to be parsed in a text editor, for analysis.
try:
fout = open('tmp.htm', 'w')
except:
print('Could not open output file\n')
fout.writelines(f.readlines())
fout.close()
Đó là về việc bắt đầu trang đầu tiên. Như đã nói ở trên, sau đó, một người sẽ cần phải phân tích cú pháp trang, tức là tìm các phần quan tâm và thu thập chúng một cách thích hợp và lưu trữ chúng vào tệp/cơ sở dữ liệu/ở bất cứ đâu. Công việc này có thể được thực hiện theo nhiều cách: sử dụng các trình phân tích cú pháp html, hoặc kiểu kỹ thuật XSLT (thực sự sau khi phân tích cú pháp html thành xml), hoặc thậm chí cho các công việc thô, biểu thức chính quy đơn giản. Ngoài ra, một trong những mục thường trích xuất là "thông tin tiếp theo", tức là một liên kết các loại, có thể được sử dụng trong một yêu cầu mới đến máy chủ để nhận các trang tiếp theo.
Điều này sẽ cung cấp cho bạn một hương vị thô sơ về những gì "dài tay" html cạo là về. Có rất nhiều cách tiếp cận khác, chẳng hạn như utilties dành riêng, tập lệnh trong trình cắm GreaseMonkey của Mozilla (FireFox), XSLT ...
Nếu tôi đang sử dụng Google Chrome, thì tôi nên thay thế giá trị cho 'HTTP_USER_AGENT' như thế nào? Tôi xin lỗi nếu câu hỏi này là câm kể từ khi tôi không làm nhiều thứ web. Cảm ơn! – taocp
@taocp, một cách dễ dàng để biết chuỗi 'HTTP_USER_AGENT' để sử dụng cho một trình duyệt cụ thể là truy cập http://www.all-nettools.com/toolbox/environmental-variables-test.php trang này sẽ hiển thị cho bạn các giá trị tiêu đề được trình duyệt gửi, hãy tìm "HTTP_USER_AGENT". Chuỗi thực tế phụ thuộc vào hệ điều hành và phiên bản cụ thể và bản dựng Chrome, nhưng phải giống một số 'như' Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/29.0.1547.66 Safari/537.36' – mjv
cảm ơn rất nhiều câu trả lời của bạn. Tôi đã thử mã của bạn với các giá trị thích hợp được đặt cho trình duyệt chrome của tôi. Tệp tmp.htm kết quả cho biết "không tìm thấy kết quả", trong khi khi tôi đặt "york" trên trang web, nó trả về rất nhiều. Bạn có biết tại sao? – taocp