python2.7实现爬虫网页数据

最近刚学习Python,做了个简单的爬虫,作为一个简单的demo希望帮助和我一样的初学者。

代码使用python2.7做的爬虫  抓取51job上面的职位名,公司名,薪资,发布时间等等。

直接上代码,代码中注释还算比较清楚 ,没有安装mysql需要屏蔽掉相关代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

from bs4 import BeautifulSoup
import urllib
import urllib2
import codecs
import re
import time
import logging
import MySQLdb 

class Jobs(object): 

  # 初始化
  """docstring for Jobs""" 

  def __init__(self):
    super(Jobs, self).__init__() 

    logging.basicConfig(level=logging.DEBUG,
         format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
    #数据库的操作,没有mysql可以做屏蔽
    self.db = MySQLdb.connect('127.0.0.1','root','rootroot','MySQL_Test',charset='utf8')
    self.cursor = self.db.cursor() 

    #log日志的显示
    self.logger = logging.getLogger("sjk") 

    self.logger.setLevel(level=logging.DEBUG) 

    formatter = logging.Formatter(
      '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler = logging.FileHandler('log.txt')
    handler.setFormatter(formatter)
    handler.setLevel(logging.DEBUG)
    self.logger.addHandler(handler) 

    self.logger.info('初始化完成') 

  # 模拟请求数据
  def jobshtml(self, key, page='1'):
    try:
      self.logger.info('开始请求第' + page + '页')
      #网页url
      searchurl = "https://search.51job.com/list/040000,000000,0000,00,9,99,{key},2,{page}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" 

      user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0'
      #设置请求头
      header = {'User-Agent': user_agent, 'Host': 'search.51job.com',
           'Referer': 'https://www.51job.com/'}
      #拼接url
      finalUrl = searchurl.format(key=key, page=page) 

      request = urllib2.Request(finalUrl, headers=header) 

      response = urllib2.urlopen(request)
      #等待网页加载完成
      time.sleep(3)
      #gbk格式解码
      info = response.read().decode('gbk') 

      self.logger.info('请求网页网页') 

      self.decodeHtml(info=info, key=key, page=page) 

    except urllib2.HTTPError as e:
      print e.reason 

  # 解析网页数据
  def decodeHtml(self, info, key, page):
    self.logger.info('开始解析网页数据')
    #BeautifulSoup 解析网页
    soup = BeautifulSoup(info, 'html.parser')
    #找到class = t1 t2 t3 t4 t5 的标签数据
    ps = soup.find_all(attrs={"class": re.compile(r'^t[1-5].*')})
    #打开txt文件 a+ 代表追加
    f = codecs.open(key + '.txt', 'a+', 'UTF-8')
    #清除之前的数据信息
    f.truncate() 

    f.write('\n------------' + page + '--------------\n') 

    count = 1 

    arr = []
    #做一些字符串的处理,形成数据格式  iOS开发工程师 有限公司 深圳-南山区 0.9-1.6万/月 05-16
    for pi in ps:
      spe = " "
      finalstr = pi.getText().strip()
      arr.append(finalstr)
      if count % 5 == 0:
        #每一条数据插入数据库,如果没有安装mysql 可以将当前行注释掉
        self.connectMySQL(arr=arr)
        arr = []
        spe = "\n"
      writestr = finalstr + spe
      count += 1
      f.write(writestr)
    f.close() 

    self.logger.info('解析完成') 

#数据库操作 没有安装mysql 可以屏蔽掉
  def connectMySQL(self,arr):
    work=arr[0]
    company=arr[1]
    place=arr[2]
    salary=arr[3]
    time=arr[4] 

    query = "select * from Jobs_tab where \
    company_name='%s' and work_name='%s' and work_place='%s' \
    and salary='%s' and time='%s'" %(company,work,place,salary,time)
    self.cursor.execute(query) 

    queryresult = self.cursor.fetchall()
    #数据库中不存在就插入数据 存在就可以更新数据 不过我这边没有写
    if len(queryresult) > 0:
      sql = "insert into Jobs_tab(work_name,company_name,work_place,salary\
          ,time) values('%s','%s','%s','%s','%s')" %(work,company,place,salary,time) 

      try:
        self.cursor.execute(sql)
        self.db.commit() 

      except Exception as e:
        self.logger.info('写入数据库失败') 

  #模拟登陆
  # def login(self):
  #   data = {'action':'save','isread':'on','loginname':'18086514327','password':'kui4131sjk'} 

  # 开始抓取 主函数
  def run(self, key): 

    # 只要前5页的数据 key代表搜索工做类型 这边我是用的ios page是页数
    for x in xrange(1, 6):
      self.jobshtml(key=key, page=str(x)) 

    self.logger.info('写入数据库完成') 

    self.db.close() 

if __name__ == '__main__': 

  Jobs().run(key='iOS') 

这样抓取网页数据格式如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2018-05-24

python爬虫 使用真实浏览器打开网页的两种方法总结

1.使用系统自带库 os 这种方法的优点是,任何浏览器都能够使用, 缺点不能自如的打开一个又一个的网页 import os os.system('"C:/Program Files/Internet Explorer/iexplore.exe" http://www.baidu.com') 2.使用python 集成的库 webbroswer python的webbrowser模块支持对浏览器进行一些操作,主要有以下三个方法: import webbrowser webbrowser.

Python爬取成语接龙类网站

介绍 本文将展示如何利用Python爬虫来实现诗歌接龙. 该项目的思路如下: 利用爬虫爬取诗歌,制作诗歌语料库: 将诗歌分句,形成字典:键(key)为该句首字的拼音,值(value)为该拼音对应的诗句,并将字典保存为pickle文件: 读取pickle文件,编写程序,以exe文件形式运行该程序. 该项目实现的诗歌接龙,规则为下一句的首字与上一句的尾字的拼音(包括声调)一致.下面将分步讲述该项目的实现过程. 诗歌语料库 首先,我们利用Python爬虫来爬取诗歌,制作语料库.爬取的网址为:https

Python爬虫之网页图片抓取的方法

一.引入 这段时间一直在学习Python的东西,以前就听说Python爬虫多厉害,正好现在学到这里,跟着小甲鱼的Python视频写了一个爬虫程序,能实现简单的网页图片下载. 二.代码 __author__ = "JentZhang" import urllib.request import os import random import re def url_open(url): ''' 打开网页 :param url: :return: ''' req = urllib.reques

解决Python网页爬虫之中文乱码问题

Python是个好工具,但是也有其固有的一些缺点.最近在学习网页爬虫时就遇到了这样一种问题,中文网站爬取下来的内容往往中文显示乱码.看过我之前博客的同学可能知道,之前爬取的一个学校网页就出现了这个问题,但是当时并没有解决,这着实成了我一个心病.这不,刚刚一解决就将这个方法公布与众,大家一同分享. 首先,我说一下Python中文乱码的原因,Python中文乱码是由于Python在解析网页时默认用Unicode去解析,而大多数网站是utf-8格式的,并且解析出来之后,python竟然再以Unicod

Python 网络爬虫--关于简单的模拟登录实例讲解

和获取网页上的信息不同,想要进行模拟登录还需要向服务器发送一些信息,如账号.密码等等. 模拟登录一个网站大致分为这么几步: 1.先将登录网站的隐藏信息找到,并将其内容先进行保存(由于我这里登录的网站并没有额外信息,所以这里没有进行信息筛选保存) 2.将信息进行提交 3.获取登录后的信息 先给上源码 <span style="font-size: 14px;"># -*- coding: utf-8 -*- import requests def login(): sessi

Python实现爬虫从网络上下载文档的实例代码

最近在学习Python,自然接触到了爬虫,写了一个小型爬虫软件,从初始Url解析网页,使用正则获取待爬取链接,使用beautifulsoup解析获取文本,使用自己写的输出器可以将文本输出保存,具体代码如下: Spider_main.py # coding:utf8 from baike_spider import url_manager, html_downloader, html_parser, html_outputer class SpiderMain(object): def __ini

python爬虫_实现校园网自动重连脚本的教程

一.背景 最近学校校园网不知道是什么情况,总出现掉线的情况.每次掉线都需要我手动打开web浏览器重新进行账号密码输入,重新进行登录.系统的问题我没办法解决,但是可以写一个简单的python脚本用于自动登录校园网.每次掉线后,再打开任意网页就是这个页面. 二.实现代码 #-*- coding:utf-8 -*- __author__ = 'pf' import time import requests class Login: #初始化 def __init__(self): #检测间隔时间,单位

Python3.x爬虫下载网页图片的实例讲解

一.选取网址进行爬虫 本次我们选取pixabay图片网站 url=https://pixabay.com/ 二.选择图片右键选择查看元素来寻找图片链接的规则 通过查看多个图片路径我们发现取src路径都含有 https://cdn.pixabay.com/photo/ 公共部分且图片格式都为.jpg 因此正则表达式为 re.compile(r'^https://cdn.pixabay.com/photo/.*?jpg$') 通过以上的分析我们可以开始写程序了 #-*- coding:utf-8 -

Python使用爬虫爬取静态网页图片的方法详解

本文实例讲述了Python使用爬虫爬取静态网页图片的方法.分享给大家供大家参考,具体如下: 爬虫理论基础 其实爬虫没有大家想象的那么复杂,有时候也就是几行代码的事儿,千万不要把自己吓倒了.这篇就清晰地讲解一下利用Python爬虫的理论基础. 首先说明爬虫分为三个步骤,也就需要用到三个工具. ① 利用网页下载器将网页的源码等资源下载. ② 利用URL管理器管理下载下来的URL ③ 利用网页解析器解析需要的URL,进而进行匹配. 网页下载器 网页下载器常用的有两个.一个是Python自带的urlli

python爬虫爬取监控教务系统的思路详解

这几天考了大大小小几门课,教务系统又没有成绩通知功能,为了急切想知道自己挂了多少门,于是我写下这个脚本. 设计思路: 设计思路很简单,首先对已有的成绩进行处理,变为list集合,然后定时爬取教务系统查成绩的页面,对爬取的成绩也处理成list集合,如果newList的长度增加了,就找出增加的部分,并通过邮件通知我. 脚本运行效果: 服务器: 发送邮件通知: 代码如下: import datetime import time from email.header import Header impor

Java爬取豆瓣电影数据的方法详解

本文实例讲述了Java爬取豆瓣电影数据的方法.分享给大家供大家参考,具体如下: 所用到的技术有Jsoup,HttpClient. Jsoup jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. HttpClient HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资

Gulp实现静态网页模块化的方法详解

前言 在做纯静态页面开发的过程中,难免会遇到一些的尴尬问题.比如:整套代码有50个页面,其中有40个页面顶部和底部模块相同.那么同样的两段代码我们复制了40遍(最难受的方法).然后,这个问题就这样解决了.再然后,产品经理看了几遍后突然说顶部的某块需要改改设计...突然感觉好尴尬~~(心里是万马奔腾~),然后呢?然后就期待下一次的万马奔腾!!! 虽然类似问题的解决方案很多,但是纯前端,不用各种框架的情况下,一种比iframe更靠谱的解决方案莫过于用像gulp这样的构建工具来完成.虽然在体验上也许会

Python爬虫爬取一个网页上的图片地址实例代码

本文实例主要是实现爬取一个网页上的图片地址,具体如下. 读取一个网页的源代码: import urllib.request def getHtml(url): html=urllib.request.urlopen(url).read() return html print(getHtml(http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A3%81%E7%BA%B8&ct=201326592&am

使用Python多线程爬虫爬取电影天堂资源

最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. 先来简单介绍一下,网络爬虫的基本实现原理吧.一个爬虫首先要给它一个起点,所以需要精心选取一些URL作为起点,然后我们的爬虫从这些起点出发,抓取并解析所抓取到的页面,将所需要的信息提取出来,同时获得的新的URL插入到队列中作为下一次爬取的起点.这样不断地循环,一直到获得你想得到的所有的信息爬虫的任务

Python实现爬虫爬取NBA数据功能示例

本文实例讲述了Python实现爬虫爬取NBA数据功能.分享给大家供大家参考,具体如下: 爬取的网站为:stat-nba.com,这里爬取的是NBA2016-2017赛季常规赛至2017年1月7日的数据 改变url_header和url_tail即可爬取特定的其他数据. 源代码如下: #coding=utf-8 import sys reload(sys) sys.setdefaultencoding('utf-8') import requests import time import urll

Linux使用Node.js建立访问静态网页的服务实例详解

Linux使用Node.js建立访问静态网页的服务实例详解 一.安装node.js运行所需要的环境,:http://www.jb51.net/article/79536.htm 二.创建node目录(/node/www),并在目录下创建node.js服务文件server.js var http = require('http'); var fs = require('fs');//引入文件读取模块 var documentRoot = '/node/www';//需要访问的文件的存放目录 var

对Pyhon实现静态变量全局变量的方法详解

python不能像C++一样直接定义一个static变量或者通过extern来导入别的库的变量而实现数据共享,但是python的思想是通过模块化来解决这个问题,就是通过模块来实现全局变量. 首先新建一个global_var_model .py的文件,也就是存储全局变量的模块 # coding=utf-8 #在别的文件使用方法: #import global_var_model as gl #gl.gl_int_i += 4,可以通过访问和修改gl.gl_int_i来实现python的全局变量,或

Python 3.6 性能测试框架Locust安装及使用方法(详解)

背景 Python3.6 性能测试框架Locust的搭建与使用 基础 python版本:python3.6 开发工具:pycharm Locust的安装与配置 点击"File"→"setting" 点击"setting",进入设置窗口,选择"Project Interpreter" 点击"+" 输入需要"Locust",点击"Install Package" 安装完成