Web Scraping Framework
See the codeSince 2018 (which is the year of most recent Grab release) I have tried to do large refactoring of code base of Grab library. Which ended up with semi-working product which nobody uses, including me. I have decided to reset all project files to the state of most recent pypi release 0.6.41 dated by june 2018. At least, now the code base corresponds to live version of the product which is being used by some people, according to pypi stats.
I've updated Grab code base and code base of its dependencies to be compatible with Python 2.7 and Python 3.13 (and, hopefully, all py versions between these two). I have set up github action to run all tests on Python 2.7 and Python 3.13.
There is NO new features. It is just an updated code base which is alive now i.e. it can run on Python 2.7 or on modern python, and its tests pass, and it has github CI config to run tests on new commits.
One backward-incompatible change is that I do not use weblib.error::DataNotFound and weblib.error::ResponseNotValid
exceptions anymore. Now Grab uses DataNotFound and InvalidResponseError exceptions which is stored in grab.errors module.
So, if your code imports DataNotFound or ResponseNotValid from weblib, you should fix such imports. Also, if
your code explicitly catches these weblib exceptions then you should convert it to catch new grab.error exceptions.
The major version of new release is 1. If you use Grab in your project and you want to keep old release to be sure
there is no backward-compatility bugs, then use this specification in your requirements file grab<1.0.
You are welcome to talk about web scraping and data processing in these Telegram chat groups: @grablab (English) and @grablab_ru (Russian)
Documentation: https://grab.readthedocs.io/en/stable/
Run pip install -U grab
See details about installing Grab on different platforms here https://grab.readthedocs.io/en/stable/usage/installation.html
Grab is a python web scraping framework. Grab provides a number of helpful methods to perform network requests, scrape web sites and process the scraped content:
Spider is a framework for writing web-site scrapers. Features:
import logging
from grab import Grab
logging.basicConfig(level=logging.DEBUG)
g = Grab()
g.go('https://github.com/login')
g.doc.set_input('login', '****')
g.doc.set_input('password', '****')
g.doc.submit()
g.doc.save('/tmp/x.html')
g.doc('//ul[@id="user-links"]//button[contains(@class, "signout")]').assert_exists()
home_url = g.doc('//a[contains(@class, "header-nav-link name")]/@href').text()
repo_url = home_url + '?tab=repositories'
g.go(repo_url)
for elem in g.doc.select('//h3[@class="repo-list-name"]/a'):
print('%s: %s' % (elem.text(),
g.make_url_absolute(elem.attr('href'))))
import logging
from grab.spider import Spider, Task
logging.basicConfig(level=logging.DEBUG)
class ExampleSpider(Spider):
def task_generator(self):
for lang in 'python', 'ruby', 'perl':
url = 'https://www.google.com/search?q=%s' % lang
yield Task('search', url=url, lang=lang)
def task_search(self, grab, task):
print('%s: %s' % (task.lang,
grab.doc('//div[@class="s"]//cite').text()))
bot = ExampleSpider(thread_number=2)
bot.run()
Overall
Maintained
Code review
PyPI
Latest release
Releases this year
770 followers · starred Nov 2018
73 followers · starred Dec 2022
74 followers · starred Dec 2016
66 followers · starred Jun 2015
Web Scraping Framework
See the codeSince 2018 (which is the year of most recent Grab release) I have tried to do large refactoring of code base of Grab library. Which ended up with semi-working product which nobody uses, including me. I have decided to reset all project files to the state of most recent pypi release 0.6.41 dated by june 2018. At least, now the code base corresponds to live version of the product which is being used by some people, according to pypi stats.
I've updated Grab code base and code base of its dependencies to be compatible with Python 2.7 and Python 3.13 (and, hopefully, all py versions between these two). I have set up github action to run all tests on Python 2.7 and Python 3.13.
There is NO new features. It is just an updated code base which is alive now i.e. it can run on Python 2.7 or on modern python, and its tests pass, and it has github CI config to run tests on new commits.
One backward-incompatible change is that I do not use weblib.error::DataNotFound and weblib.error::ResponseNotValid
exceptions anymore. Now Grab uses DataNotFound and InvalidResponseError exceptions which is stored in grab.errors module.
So, if your code imports DataNotFound or ResponseNotValid from weblib, you should fix such imports. Also, if
your code explicitly catches these weblib exceptions then you should convert it to catch new grab.error exceptions.
The major version of new release is 1. If you use Grab in your project and you want to keep old release to be sure
there is no backward-compatility bugs, then use this specification in your requirements file grab<1.0.
You are welcome to talk about web scraping and data processing in these Telegram chat groups: @grablab (English) and @grablab_ru (Russian)
Documentation: https://grab.readthedocs.io/en/stable/
Run pip install -U grab
See details about installing Grab on different platforms here https://grab.readthedocs.io/en/stable/usage/installation.html
Grab is a python web scraping framework. Grab provides a number of helpful methods to perform network requests, scrape web sites and process the scraped content:
Spider is a framework for writing web-site scrapers. Features:
import logging
from grab import Grab
logging.basicConfig(level=logging.DEBUG)
g = Grab()
g.go('https://github.com/login')
g.doc.set_input('login', '****')
g.doc.set_input('password', '****')
g.doc.submit()
g.doc.save('/tmp/x.html')
g.doc('//ul[@id="user-links"]//button[contains(@class, "signout")]').assert_exists()
home_url = g.doc('//a[contains(@class, "header-nav-link name")]/@href').text()
repo_url = home_url + '?tab=repositories'
g.go(repo_url)
for elem in g.doc.select('//h3[@class="repo-list-name"]/a'):
print('%s: %s' % (elem.text(),
g.make_url_absolute(elem.attr('href'))))
import logging
from grab.spider import Spider, Task
logging.basicConfig(level=logging.DEBUG)
class ExampleSpider(Spider):
def task_generator(self):
for lang in 'python', 'ruby', 'perl':
url = 'https://www.google.com/search?q=%s' % lang
yield Task('search', url=url, lang=lang)
def task_search(self, grab, task):
print('%s: %s' % (task.lang,
grab.doc('//div[@class="s"]//cite').text()))
bot = ExampleSpider(thread_number=2)
bot.run()
Overall
Maintained
Code review
PyPI
Latest release
Releases this year
770 followers · starred Nov 2018
73 followers · starred Dec 2022
74 followers · starred Dec 2016
66 followers · starred Jun 2015