web抓取使用python请求模块

时间:2018-01-31 13:13:03

标签: python web-scraping

我正在尝试使用python开发一个脚本,以便在特定网站上抓取一些信息用于学习目的。 我浏览了很多不同的教程和帖子,尝试从他们那里收集一些见解,它们非常有用,但仍然没有帮助我找到登录网站并使用不同关键词进行搜索的方法。

我尝试使用不同的API,例如requestsurllib,也许我找不到解决问题的正确方法。

步骤列表如下:

登录信息设置

将登录信息发送到网站并获得回复以供将来使用

关键字设置

导入标题

设置cookiejar

从登录回复,进行搜索

在我尝试之后,它将随机工作,

这是代码:

import getpass
# marvin
# date:2018/2/7

# login stage preparation
def login_values():
    login="https://www.****.com/login"
    username = input("Please insert your username: ") 
    password = getpass.getpass("Please type in your password: ")
    host="www.****.com"
    #store login screts
    data = {
        "username": username, 
        "password": password, 
    }
    return login,host,data

以下是从网站获取HTML文件

import requests
import random
import http.cookiejar
import socket
# Set up web scraping function to output the html text file
def webscrape(login_url,host_url,login_data,target_url):
    #static values preparation
    ##import header
    user_agents = [
                ***
                ] 
    agent = random.choice(user_agents)
    headers={'User-agent':agent,
            'Accept':'*/*',
             'Accept-Language':'en-US,en;q=0.9;zh-cmn-Hans',
             'Host':host_url,
             'charset':'utf-8',
            }
    ##set up cookie jar
    cj = http.cookiejar.CookieJar()
    #
    # get the html file
    socket.setdefaulttimeout(20)
    s=requests.Session()
    req=s.post(login_url, data=login_data)
    res = s.get(target_url, cookies=cj,headers=headers)
    html=res.text
    return html

以下是从html获取每个链接的代码:

from bs4 import BeautifulSoup


#set up html parsing function for parsing all the list links
def getlist(keyword,loginurl,hosturl,valuesurl,html_lists):
    page=1
    pagenum=10# set up maximum page num
    links=[]
    soup=BeautifulSoup(html_lists,"lxml")
    try:
        for li in soup.find("div",class_="search_pager human_pager in-block").ul.find_all('li'):
            target_part=soup.find_all("div",class_="search_result_single search-2017 pb25 pt25 pl30 pr30 ")
            [links.append(link.find('a')['href']) for link in target_part]
            page+=1
            if page<=pagenum:
                    try:
                        nexturl=soup.find('div',class_='search_pager human_pager in-block').ul.find('li',class_='pagination-next ng-scope ').a['href'] #next page
                    except AttributeError:
                        print("{}'s links are all stored!".format(keyword))
                        return links
                    else:
                        chs_html=webscrape(loginurl,hosturl,valuesurl,nexturl)
                        soup=BeautifulSoup(chs_html,"lxml")
    except AttributeError:
        target_part=soup.find_all("div",class_="search_result_single search-2017 pb25 pt25 pl30 pr30 ")
        [links.append(link.find('a')['href']) for link in target_part]
        print("There is only one page")
        return links

测试代码为:

keyword="****"
myurl="https://www.****.com/search/os2?key={}".format(keyword)
chs_html=webscrape(login,host,values,myurl)
chs_links=getlist(keyword,login,host,values,chs_html)
targethtml=webscrape(login,host,values,chs_links[1])

总共有22个链接,一个页面包含19个链接,所以它应该有多个页面,如果显示结果“只有一个页面”,则表示失败。

的问题:

  1. login_values函数是通过将所有函数组合到最终函数来保护我的登录信息,但显然,用户名和密码仍然很容易通过print()命令显示。

  2. 这个主要问题!!就像我之前提到的,这种方法是随机的。顺便说一句,我的意思是不工作,HTML文件只是登录页面而不是搜索结果。我希望得到一个更好的控制,使其在大多数时间工作。我每次都通过打印agent检查用户代理,看看它们是否相关,但事实并非如此!我将可疑的cookie清除到完整的存储内存,但事实并非如此。

  3. 有时我遇到最大试用错误或操作系统错误,我想这是我试图达到的服务器的错误,有没有办法可以为我设置一个等待计时器来防止这些错误从发生?

0 个答案:

没有答案