Python网络爬虫数据提取神器 Selector 的用法( 二 )

这里最重要的一个变量就是 requests 库的 Session,它可以帮助我们维持一个会话,而且可以自动处理 Cookies,我们不用再去担心 Cookies 的问题 。
接下来,访问登录页面要完成两件事:一是通过此页面获取初始的 Cookies,二是提取出 authenticity_token 。
在这里我们实现一个 token() 方法,如下所示:
from lxml import etree def token(self):    response = self.session.get(self.login_url, headers=self.headers)    selector = etree.HTML(response.text)    token = selector.xpath('//div/input[2]/@value')[0]    return token我们用 Session 对象的 get() 方法访问 GitHub 的登录页面,然后用 XPath 解析出登录所需的 authenticity_token 信息并返回 。
现在已经获取初始的 Cookies 和 authenticity_token,开始模拟登录,实现一个 login() 方法,如下所示:
def login(self, email, password):    post_data = https://www.isolves.com/it/cxkf/yy/Python/2020-09-27/{ 'commit': 'Sign in', 'utf8': '?', 'authenticity_token': self.token(), 'login': email, 'password': password } response = self.session.post(self.post_url, data=post_data, headers=self.headers) if response.status_code == 200: self.dynamics(response.text) response = self.session.get(self.logined_url, headers=self.headers) if response.status_code == 200: self.profile(response.text)首先构造一个表单,复制各个字段,其中 email 和 password 是以变量的形式传递 。然后再用 Session 对象的 post() 方法模拟登录即可 。由于 requests 自动处理了重定向信息,我们登录成功后就可以直接跳转到首页,首页会显示所关注人的动态信息,得到响应之后我们用 dynamics() 方法来对其进行处理 。接下来再用 Session 对象请求个人详情页,然后用 profile() 方法来处理个人详情页信息 。
其中,dynamics() 方法和 profile() 方法的实现如下所示:
 
def dynamics(self, html):    selector = etree.HTML(html)    dynamics = selector.xpath('//div[contains(@class, "news")]//div[contains(@class, "alert")]')    for item in dynamics:        dynamic = ' '.join(item.xpath('.//div[@class="title"]//text()')).strip()        print(dynamic) def profile(self, html):    selector = etree.HTML(html)    name = selector.xpath('//input[@id="user_profile_name"]/@value')[0]    email = selector.xpath('//select[@id="user_profile_email"]/option[@value!=""]/text()')    print(name, email)在这里,我们仍然使用 XPath 对信息进行提取 。在 dynamics() 方法里,我们提取了所有的动态信息,然后将其遍历输出 。在 prifile() 方法里,我们提取了个人的昵称和绑定的邮箱,然后将其输出 。这样,整个类的编写就完成了 。
5. 运行我们新建一个 Login 对象,然后运行程序,如下所示
if __name__ == "__main__":    login = Login()    login.login(email='cqc@cuiqingcai.com', password='password') 
在 login() 方法传入用户名和密码,实现模拟登录 。
可以看到控制台有类似如下输出:
GrahamCampbell  starred  nunomaduro/zero-frameworkGrahamCampbell  starred  nunomaduro/laravel-zerohappyAnger6  created repository  happyAnger6/nodejs_chatroomvIOSey  starred  nitely/Spiritlbgws2  starred  Germey/TaobaoMMEasyChris  starred  ageitgey/face_recognitioncallmewhy  starred  macmade/GitHubUpdatessindresorhus  starred  sholladay/squatterSamyPesse  starred  graphcool/chromelesswbotelhos  starred  tkadlec/grunt-perfbudgetwbotelhos  created repository  wbotelhos/eggyleohxj  starred  MacGesture/MacGestureGrahamCampbell  starred  GrahamCampbell/AnalyzerEasyChris  starred  golang/gomitulgolakiya  starred  veltman/flubberliaoyuming  pushed to  student  at  Germey/SecurityCourseleohxj  starred  jasonslyvia/a-cartoon-intro-to-redux-cnruanyf  starred  ericchiang/pupruanyf  starred  bpesquet/thejswaylouwailou  forked  Germey/ScrapyTutorial  to  louwailou/ScrapyTutorialLving  forked  shadowsocksr-backup/shadowsocksr  to  Lving/shadowsocksrqifuren1985  starred  Germey/ADSLProxyPoolQWp6t  starred  laravel/frameworkGermey ['1016903103@qq.com', 'cqc@cuiqingcai.com']


推荐阅读