2012-11-02 25 views
11

Tôi muốn sử dụng python để xóa kết quả tìm kiếm trên Google Scholar. Tôi tìm thấy hai kịch bản khác nhau để làm điều đó, một là gscholar.py và khác là scholar.py (có thể được sử dụng như một thư viện python?).Trích xuất kết quả của Google Scholar bằng Python (hoặc R)

Bây giờ, tôi có lẽ nên nói rằng tôi hoàn toàn mới với python, vì vậy xin lỗi nếu tôi bỏ lỡ điều hiển nhiên!

Vấn đề là khi tôi sử dụng gscholar.py như được giải thích trong các tập tin README, tôi nhận được kết quả là

query() takes at least 2 arguments (1 given). ..

Ngay cả khi tôi chỉ định tham số khác (ví dụ gscholar.query("my query", allresults=True), tôi nhận được

query() takes at least 2 arguments (2 given)

này câu đố tôi, tôi cũng đã cố gắng để xác định số thứ ba có thể (outformat=4; đó là định dạng BibTex) nhưng điều này Một đồng nghiệp khuyên tôi nên nhập BeautifulSoup và this trước khi chạy truy vấn, nhưng điều đó cũng không thay đổi được vấn đề. xem link) như một giải pháp nhưng đã nhanh chóng bị chặn bởi google. Có lẽ ai đó có thể đề xuất cách cải thiện mã đó để tránh bị chặn? Bất kỳ trợ giúp sẽ được đánh giá cao! Cảm ơn!

+0

Tôi đã cập nhật câu trả lời của mình bằng cách truy cập chặn truy cập của Google ... – Sheena

Trả lời

12

Tôi khuyên bạn không nên sử dụng các thư viện cụ thể để thu thập thông tin các trang web cụ thể, nhưng để sử dụng các thư viện HTML có mục đích chung được kiểm tra tốt và có tài liệu được định dạng tốt như BeautifulSoup.

Đối với việc truy cập các trang web với một thông tin trình duyệt, bạn có thể sử dụng một lớp url mở với một đại lý người dùng tùy chỉnh:

from urllib import FancyURLopener 
class MyOpener(FancyURLopener): 
    version = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36' 
openurl = MyOpener().open 

Và sau đó tải các url được yêu cầu như sau:

openurl(url).read() 

Đối với lấy kết quả học giả chỉ sử dụng địa chỉ http://scholar.google.se/scholar?hl=en&q=${query}.

Để giải nén mẩu thông tin từ một tập tin HTML truy xuất, bạn có thể sử dụng đoạn mã này:

from bs4 import SoupStrainer, BeautifulSoup 
page = BeautifulSoup(openurl(url).read(), parse_only=SoupStrainer('div', id='gs_ab_md')) 

Đoạn mã này trích ra một div yếu tố cụ thể có chứa số lượng kết quả hiển thị trong một tìm kiếm trên Google Scholar trang kết quả.

+1

Bạn đã tạo chuỗi phiên bản bằng cách nào? –

+0

Tôi có thể chỉ định đường dẫn đến chứng chỉ trong mã này ở đâu? – AlwaysLearning

5

Google sẽ chặn bạn ... vì rõ ràng bạn không phải là trình duyệt. Cụ thể, họ sẽ phát hiện chữ ký yêu cầu tương tự xảy ra quá thường xuyên cho hoạt động của con người ....

Bạn có thể làm:

+0

Tôi đang cố gắng lấy một trang duy nhất: 'requests.get (" https://scholar.google.com/scholar?q=compressed+ vi phân + heuristic ")' và vẫn nhận được '' – AlwaysLearning

+0

@AlwaysLearning, Cảm ơn bạn đã ủng hộ yêu cầu ban đầu của tôi. – 0x90

1

ở đây là chữ ký cuộc gọi của truy vấn() ...

def query(searchstr, outformat, allresults=False) 

do đó bạn cần phải xác định một searchstr VÀ một outformat ít nhất, và allresults là một lá cờ tùy chọn/lập luận.

+0

có vẻ trái ngược với tài liệu của họ, không chắc chắn nên nói gì về tài liệu đó ... –

+0

Cảm ơn câu trả lời, nhưng tôi đã thử điều đó (xin lỗi vì chưa đủ rõ ràng), vì vậy ví dụ: khi tôi truy vấn ("truy vấn của tôi", 4, allresults = False) - 4 nên là BibTex nếu tôi hiểu chính xác - sau đó tôi nhận được sau đây: truy vấn chức năng trong gscholar.py tại dòng 66 response = urllib2.urlopen (yêu cầu) urlopen chức năng trong urllib2.py tại dòng 126 trả lại _opener.mở (url, dữ liệu, thời gian chờ) chức năng mở trong urllib2.py tại dòng 400 phản ứng = meth (req, phản ứng) chức năng http_response trong urllib2.py tại dòng 513 'http', yêu cầu, phản ứng, mã, msg, hdrs), v.v. – Flow

+0

hmmm, có vẻ như bạn có thể có hai vấn đề riêng biệt sau đó. Một là nhận được chữ ký cuộc gọi chính xác (Lưu ý rằng outformat KHÔNG phải là một đối số tùy chọn, bạn PHẢI xác định nó). Thứ hai là có xuất hiện rằng urllib2 (tiêu chuẩn Python lib cho url mở) là có vấn đề với url bạn đã cho nó. –

2

COPython có vẻ đúng nhưng đây là một chút của một lời giải thích bằng ví dụ ...

xem xét f:

def f(a,b,c=1): 
    pass 

f hy vọng giá trị cho a và b không có vấn đề gì. Bạn có thể để trống.

f(1,2)  #executes fine 
f(a=1,b=2) #executes fine 
f(1,c=1) #TypeError: f() takes at least 2 arguments (2 given) 

Thực tế là bạn đang bị Google chặn có thể do cài đặt tác nhân người dùng của bạn trong tiêu đề ...Tôi không quen với R nhưng tôi có thể cung cấp cho bạn các thuật toán chung cho sửa chữa này:

  1. sử dụng một trình duyệt thông thường (firefox hoặc bất kỳ) để truy cập vào url trong khi theo dõi lưu lượng HTTP (Tôi thích Wireshark)
  2. take note của tất cả các tiêu đề được gửi trong yêu cầu http thích hợp
  3. thử chạy kịch bản của bạn và cũng lưu ý các tiêu đề
  4. tại chỗ sự khác biệt
  5. thiết lập kịch bản R của bạn để tận dụng các tiêu đề bạn thấy khi kiểm tra lưu lượng duyệt
3

Dường như cào bằng Python và R chạy vào vấn đề mà Google Scholar thấy yêu cầu của bạn dưới dạng truy vấn rô bốt do thiếu tác nhân người dùng trong yêu cầu. Có một câu hỏi tương tự trong StackExchange về downloading all pdfs linked from a web page và câu trả lời dẫn người dùng đến với gói Unix và BeautifulSoup bằng Python.

Curl cũng có vẻ là hướng triển vọng hơn.

0

Bạn có thể muốn sử dụng Greasemonkey cho tác vụ này. Lợi thế là google sẽ không phát hiện bạn như một bot nếu bạn giữ tần số yêu cầu xuống ngoài. Bạn cũng có thể xem tập lệnh hoạt động trong cửa sổ trình duyệt của mình.

Bạn có thể tự học cách tự viết mã hoặc sử dụng tập lệnh từ một trong các nguồn these.

Các vấn đề liên quan