beautifulsoup

beautifulsoup,第1张

beautifulsoup

好的,您可以通过以下方法真正加快速度:

  • 再往低级别的-看到正在做什么潜在的请求,并模拟它们
  • 让我们
    BeautifulSoup
    使用
    lxml
    解析
  • 使用
    SoupStrainer
    解析页面的唯一相关部件

由于这是

ASP.NET
生成的形式,并且由于它的安全性功能,事情变得更加复杂。这是完整的代码,请不要害怕-我添加了注释并提出了疑问:

import refrom bs4 import BeautifulSoup, SoupStrainerimport requests# start session and get the search pagesession = requests.Session()response = session.get('https://acadinfo.wustl.edu/Courselistings/Semester/Search.aspx')# parse the search page using SoupStrainer and lxmlstrainer = SoupStrainer('form', attrs={'id': 'form1'})soup = BeautifulSoup(response.content, 'lxml', parse_only=strainer)# get the view state, event target and validation valuesviewstate = soup.find('input', id='__VIEWSTATE').get('value')eventvalidation = soup.find('input', id='__EVENTVALIDATION').get('value')search_button = soup.find('input', value='Search')event_target = re.search(r"__doPostBack('(.*?)'", search_button.get('onclick')).group(1)# configure post request parametersdata = {    '__EVENTTARGET': event_target,    '__EVENTARGUMENT': '',    '__LASTFOCUS': '',    '__VIEWSTATE': viewstate,    '__EVENTVALIDATION': eventvalidation,    'ctl00$Body$ddlSemester': '201405',    'ctl00$Body$ddlSession': '',    'ctl00$Body$ddlDept': '%',    'ctl00$Body$ddlAttributes': '0',    'ctl00$Body$Days': 'rbAnyDay',    'ctl00$Body$Time': 'rbAnyTime',    'ctl00$Body$cbMorning': 'on',    'ctl00$Body$cbAfternoon': 'on',    'ctl00$Body$cbEvening': 'on',    'ctl00$Body$tbStart': '9:00am',    'ctl00$Body$tbEnds': '5:00pm',    'ctl00$Body$ddlUnits': '0',    'ctl00$Body$cbHideIStudy': 'on',    'ctl00$Body$courseList$hidHoverShow': 'Y',    'ctl00$Body$courseList$hidDeptBarCnt': '',    'ctl00$Body$courseList$hidSiteURL': 'https://acadinfo.wustl.edu/Courselistings',    'ctl00$Body$courseList$hidExpandDetail': '',    'ctl00$Body$hidDay': ',1,2,3,4,5,6,7',    'ctl00$Body$hidLevel': '1234',    'ctl00$Body$hidDefLevel': ''}# get the list of optionsstrainer = SoupStrainer('div', attrs={'id': 'Body_courseList_tabSelect'})options = soup.select('#Body_ddlSchool > option')for option in options:    print "Processing {option} ...".format(option=option.text)    data['ctl00$Body$ddlSchool'] = option.get('value')    # make the search post request for a particular option    response = session.post('https://acadinfo.wustl.edu/Courselistings/Semester/Search.aspx',      data=data)    result_soup = BeautifulSoup(response.content, parse_only=strainer)    print [item.text[:20].replace('&nbsp', ' ') + '...' for item in result_soup.select('div.CrsOpen')]

印刷品:

Processing Architecture ...[u'A46 ARCH 100...', u'A46 ARCH 111...', u'A46 ARCH 209...', u'A46 ARCH 211...', u'A46 ARCH 266...', u'A46 ARCH 305...', u'A46 ARCH 311...', u'A46 ARCH 323...', u'A46 ARCH 328...', u'A46 ARCH 336...', u'A46 ARCH 343...', u'A46 ARCH 350...', u'A46 ARCH 355...', u'A46 ARCH 411...', u'A46 ARCH 422...', u'A46 ARCH 428...', u'A46 ARCH 436...', u'A46 ARCH 445...', u'A46 ARCH 447...', u'A46 ARCH 465...', u'A48 LAND 451...', u'A48 LAND 453...', u'A48 LAND 461...']Processing Art ...[u'F10 ART 1052...', u'F10 ART 1073...', u'F10 ART 213A...', u'F10 ART 215A...', u'F10 ART 217B...', u'F10 ART 221A...', u'F10 ART 231I...', u'F10 ART 241D...', u'F10 ART 283T...', u'F10 ART 301A...', u'F10 ART 311E...', u'F10 ART 313D...', u'F10 ART 315B...', u'F10 ART 317H...', u'F10 ART 323A...', u'F10 ART 323B...', u'F10 ART 323C...', u'F10 ART 329C...', u'F10 ART 337E...', u'F10 ART 337F...', u'F10 ART 337H...', u'F10 ART 385A...', u'F10 ART 391M...', u'F10 ART 401A...', u'F10 ART 411E...', u'F10 ART 413D...', u'F10 ART 415B...', u'F10 ART 417H...', u'F10 ART 423A...', u'F10 ART 423B...', u'F10 ART 423C...', u'F10 ART 429C...', u'F10 ART 433C...', u'F10 ART 433D...', u'F10 ART 433E...', u'F10 ART 433K...', u'F10 ART 461C...', u'F10 ART 485A...', u'F20 ART 111P...', u'F20 ART 115P...', u'F20 ART 1186...', u'F20 ART 119C...', u'F20 ART 127A...', u'F20 ART 133B...', u'F20 ART 135G...', u'F20 ART 135I...', u'F20 ART 135J...', u'F20 ART 1361...', u'F20 ART 1363...', u'F20 ART 1713...', u'F20 ART 219C...', u'F20 ART 2363...', u'F20 ART 2661...', u'F20 ART 281S...', u'F20 ART 311P...', u'F20 ART 315P...', u'F20 ART 3183...', u'F20 ART 333B...', u'F20 ART 335A...', u'F20 ART 335J...', u'F20 ART 3713...', u'F20 ART 381S...', u'F20 ART 415P...', u'F20 ART 435I...']...

当然,这里还有一些需要改进的地方,例如,我已经对其他表单值进行了硬编码-您可能应该解析可能的值并适当地设置它们。

另一个改进是将其与

grequests

GRequests允许您将Requests与Gevent一起使用,以轻松进行异步HTTP Requests。


如您所见,当您处于较高级别并通过WebDriver与浏览器进行交互时,您不必担心实际要向服务器发送请求以获取数据的请求。这使自动化很容易,但是会很慢。当您使用低级自动化时,您有更多选择来加快处理速度,但是实现的复杂性却增长很快。另外,请考虑这种解决方案的可靠性如何。那么可能会坚持使用“黑匣子”解决方案并坚持下去

selenium
吗?


我也尝试使用以下方法解决问题:

  • mechanize
  • robobrowser
  • mechanicalsoup

但由于不同的原因而失败(可以为您提供相关的错误消息)。但是,所有这三个工具都应该有助于简化解决方案。

另请参阅类似的线程:

  • 如何与ASP网页相处


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5169523.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存